14장 타입 연산과 제네릭 사용으로 반복 줄이기
•
keyof, typeof, 인덱싱, 매핑된 타입등 도구 사용하기
•
Pick, Partial, ReturnType 같은 제네릭 타입에 익숙해지기
◦
Partial<T>
◦
ReadOnly<T>
◦
Record<K,T>
◦
Pick<T,>
◦
Omit<T,K> : 프로퍼티 중 K 제거
▪
type T = Omit<{a: ‘a’, b: ‘b’}, ‘b’>
◦
Exclude<T,U> : 속성 중 U 제거
▪
type T = Exclude<’a’ | ‘b’ | ‘c’, ‘b’> // ‘a’ | ‘c’
◦
Extract<T,U>
◦
NonNullable<T>
▪
null과 undefined를 제외한 타입
◦
Parameters<T>
▪
매개변수 타입들의 튜플 타입 구성
•
declare f({a: string, b: number}): void
•
type T = Parameters<typeof f>; // [{a: string, b: number}]
◦
ConstructorParameters<T>
▪
생성자 함수의 매개변수 타입 추출
•
type T = ConstructorParameters<ErrorConstructor>; // [(string | undefined)?]
•
type T = ConstructorParameters<FunctionConstructor>; // string[]
•
type T = ConstructorParameters<RegExpConstructor>; // [string, (string | undefined)?]
◦
ReturnType<T>
▪
T의 반환타입
◦
InstanceType<T>
▪
생성자 타입 T의 인스턴스 타입
•
class C = {a = 1} ; InstanceType<typeof C>;
◦
Required<T>
15장 동작 데이터에 인덱스 시그니처 사용하기
•
가능하다면 인터페이스, Record 보단 정확한 타입을 사용하기
16장 number 인덱스 시그니처보다는 Array, 튜플, ArrayLike 사용하기
•
number 인덱스를 속성 이름으로 사용지말고, Array, 튜플 등 사용하기
17장 변경 관련된 오류 방지를 위해 readonly 사용하기
•
변경하지 않는 경우 readonly 사용 권장
•
얕게 동작한다는 것 명시
18장 매핑된 타입을 사용하여 값을 동기화하기
•
매핑된 타입을 사용해서 값과 타입 동기화
•
새로운 속성 추가 시 선택을 강제하도록 매핑된 타입 사용
19장 추론 가능한 타입을 사용해 장황한 코드 방지하기
•
타입이 추론되는 경우 타입 구문 장석하지 않기
•
단 객체 리터럴과 함수 반환에는 명시하는 것이 좋음
20장 다른 타입에는 다른 변수 사용하기
•
변수는 선언 후 타입이 바뀌지 않도록 하기
21장 타입 넓히기
•
타입 넓히기를 통해 상수의 타입 추론법 이깋기
◦
타입 넓히기란? : 지정된 단일 값을 가지고 타입 추론하기
function getComponent(vec: {x: number, y: number, z: number}, x: keyof Vectors){ ...}
let x = 'x';
let vec = {x: 10, y: 20, z: 30};
getComponent(vec, x);
// 에러 발생
// x는 할당 시점에 넓히기가 동작해 string으로 추론됨
JavaScript
복사
•
const, as const, 타입구문을 사용해 타입 강제 활용
22장 타입 좁히기
•
분기문 사용
◦
조건문을 통해 null을 배제해 타입 좁히기 if(a)
◦
instanceof를 통해 좁히기 if(search instanceof RegExp)
◦
속성 타입을 통해 좁히기 if(’a’ in ab)
◦
단 typeof el === ‘object’ 인 경우처럼 null도 object로 나오므로 오류 조심하기
•
명시적 태그 사용
◦
타입을 식별하기 위해 커스텀 함수 도입하기
◦
{ type: ‘download’, … }와 같이 명시적으로 태그 붙이기
23장 한꺼번에 객체 생성하기
•
속성을 하나씩 추가하지말고 한번에 만들기
•
… 이용하기