Effective Typescript - week 4 (item 36-37)
10 May 2022 | TypescriptEffective Typescript - week 4 (item 36-37)
해당 포스트는 [이펙티브 타입스크립트](댄 밴더캄 지음, 장원호 옮김, 인사이트, 2021) 책을 읽으며 정리한 내용입니다.
Item36. 해당 분야의 용어로 타입 이름 짓기
타입, 변수의 이름을 잘 짓는 것은 추상화의 수준과 가독성을 높일 수 있다.
interface Animal {
name: string;
endangered: boolean;
habit: string;
}
const leopard: Animal = {
name: 'Snow Leopard',
endangered: false,
habit: 'tundra',
};
- name은 매우 일반적인 용어이므로 의미가 불분명하다
- endangered는 이미 멸종된 동물일 경우 어떻게 표현할지 불분명하다
- habit이 단순 string이라 범위가 너무 넓다
- 객체의 명과 name이 겹쳐서 의도가 다른지 불분명하다
조금 더 명확하게 데이터를 표현하고자 한다면 다음과 같을것이다
interface Animal {
commonName: string;
genus: string;
species: string;
status: ConservationStatus;
climates: KoppenClimate[];
}
type ConservationStatus = "EX" | "EW" | "CR";
type KoppenClimate = "Af" | "Am" | "As" | "Aw";
const snowLeopard: Animal = {
commonName: "Snow LeoPard",
genus: "Panthera",
species: "Uncia",
status: "EW",
climates: ["As", "Aw"],
};
- 동일한 의미를 나타낼 때에는 같은 용어를 사용해야한다
- data, item, object 등 모호하고 의미없는 이름은 지양한다
- 포함된 내용, 계산 방식 등이 아닌 데이터 자체가 무엇인지 고려해야한다
Item37. 공식 명칭에는 상표를 붙이기
구조적 타이핑으로 인해 오히려 잘못된 결과가 나올 수 있다.
값을 구분하기 위해 공식 명칭이 필요하다면 상표를 붙이는 방법을 고려해볼 수 있다.
type Meters = number & {_brand: 'meters'};
type Seconds = number & {_brand: 'seconds'};
const meters = (m: number) => m as Meters;
const seconds = (s: number) => s as Seconds;
const oneKm = meters(1000);
const oneMin = seconds(60);
참고 자료
이펙티브 타입스크립트 - 댄 밴더캄 지음