반응형
타입설계
문서에 타입정보 쓰지 않기
⇒ 타입은 ts로만 표기
생성은 엄격하게, 사용은 너그럽게
- 매개변수 타입은 반환타입에 비해 범위가 넓은 경향이 있음 ⇒ 선택속성과 유니온타입
- 매개변수와 반환타입의 재사용을 위해 기본형태(반환타입)와 느슨한 형태(매개변수타입)을 준비하는 것이 좋음
타입 주변에 null값 배치하기
- 한 값의 null 여부가 다른 값의 null 여부에 암시적으로 관련되도록 설계하면 안됨
- API작성시에는 반환타입을 큰 객체로 만들고 반환타입 자체가 null이거나 null이 아니도록 설계해야함
- strictNullChecks → null오류를 정확하게 찾아냄
유니온의 인터페이스보다는 인터페이스의 유니온을 사용
interface Layer{
layout:FIllLayout|LineLayout|PointLayout;
paint: FillPaint|LinePaint|PointPaint;
}
보다는
interface FillLayer{
layout: FillLayout
paint: FillPaintl
}
interface LinerLayer{
layout : LineLayout;
paint: LinePaint;
}
...
type Layer=FillLayer|LinerLayer|PointLayout;
string보다 더 구체적인 타입 사용하기
⇒ string은 매우 범위가 넓음
- Date타입이나 좁은 타입의 유니온 사용하기
- 객체 속성이름을 매개변수로 받을 떄는 string보다 keyof T를 사용하기
keyof
function pluch(records:any[], key:string) :any[]{
return records.map(r=>r[key]);
}
-refactor-
function plunk<T>(records:T[], key:string) : T[]{
return records.map(r=>r[key];); ==> 오류 발생
-refactor-
function pluck<T>(records:T[],key: keyof T){
return records.map(r=>r[key]);
}
_brand를 통해서 정확한 타입 구현하기
type Meters=number &{_brand:'meters');
const meters=(m:number) => m as Meters;
타입 시스템에서 동작하지만, 런타임에 상표를 검사하는 것과 동일한 효과를 가짐 →이익
반응형