Coding-Village-Protector / woowahan-ts

[우아한 타입스크립트 with 리액트] 북 스터디 📚
14 stars 2 forks source link

3.3.6 제네릭을 굳이 사용하지 않아도 되는 코드를 적절하게 수정해보세요. #6

Closed Stilllee closed 9 months ago

Stilllee commented 9 months ago

📝 117p

❓ 타입스크립트에서 제네릭이 필요하지 않을 때에도 무분별하게 사용할 경우 코드의 길이만 늘어나고 가독성을 해칠 수 있습니다.

아래의 코드에서 불필요한 부분을 찾아내 코드를 개선해보세요.

type Identity<T> = T;
type Status = "ACTIVE" | "INACTIVE" | "PENDING";

interface User {
  getStatus: () => Identity<Status>;
}

const user: User = {
  getStatus: () => "ACTIVE"
};
lulla-by commented 9 months ago

제네릭을 사용한 type Identity가 문맥상 필수 요소로 보이지 않아 다음과 같이 수정했습니다.

type Status = "ACTIVE" | "INACTIVE" | "PENDING";

interface User {
  getStatus: () => Status;
}

const user: User = {
  getStatus: () => "ACTIVE"
};
eeeyooon commented 9 months ago

Identity<T>T를 그대로 반환하기만 하고 있어 제네릭이 불필요합니다. Identity<T>를 제거하고, getStatus가 직접 Status를 반환하도록 수정할 수 있습니다.

type Status = "ACTIVE" | "INACTIVE" | "PENDING";

interface User {
  getStatus: () => Status;
}

const user: User = {
  getStatus: () => "ACTIVE"
};
sryung1225 commented 9 months ago

선언된 Identity 제네릭은 타입을 그대로 반환하는 역할을 하고 있습니다. Identity가 사용되고 있는 getStatus은 단순히 Status 타입의 값을 반환하는 것이기 때문에 굳이 Identity를 사용하는 의미가 없어 제거 가능합니다. 아래와 같이 코드를 개선시킬 수 있습니다.

type Status = "ACTIVE" | "INACTIVE" | "PENDING";

interface User {
  getStatus: () => Status;
}

const user: User = {
  getStatus: () => "ACTIVE"
};
Stilllee commented 9 months ago

이 코드에서 Identity라는 타입은 단순히 제네릭 매개변수 T를 그대로 반환하고 있습니다.

User인터페이스의 getStatus메서드에서 Identity<Status>를 반환타입으로 사용할 필요없이 직접 Status의 타입을 사용하는것이 더 간결하고 명확합니다.

따라서 다음과 같이 코드를 수정할 수 있습니다.

type Status = "ACTIVE" | "INACTIVE" | "PENDING";

interface User {
  getStatus: () => Status;
}

const user: User = {
  getStatus: () => "ACTIVE"
};

이렇게 수정하면 코드가 더 이해하기 쉽고 간결해지며, Status 타입의 목적과 사용이 명확해지므로 협업 시에도 실수를 줄일 수 있습니다.