타입 가드

  • 타입을 걸러내는 것을 말함

타입 단언

- 타입 추론이 정확하지 않을때 as 키워드를 사용해 타입을 명시하는 방법
- 예: a.length  대신에 (a as string).length
- 추론이 잘되는 것을 이상한 타입으로 명시 하면 에러 발생

타입 서술어

- 함수 리턴 타입을 명시해 true인 경우 명시된 타입으로 false인 경우 다른 타입으로 변환함
// 예제
isFish(pet: Fish | Bird): pet is Fish {}

in 연산자 사용하기

- 보통 자바스크립트 객체 안에 속성이 있는 여부를 확인할때 in 사용
- 타입으로 추론하지 않고 속성이 있는지에 따라 타입 가드 적용

instanceof 사용하기

- 보통 객체가 어떤 클래스에 속하는지 판별할때 사용
- arg instanceof User 와 같이 arg이 User 타입인지 확인

인덱스 시그니처

  • 객체의 키 이름을 모르고 타입만 알고 있는 경우 사용
  • 단점: 키가 없어도 접근이 가능함
// 예제
interface NumberObj {
  [index:string] : number;
  length: number;
  a: number
  b: string // 에러
}
  • 인덱스 시그니처를 사용한 후 keyof로 해당 객체의 key 타입을 사용할 수 있다
    • 예: let A:keyof NumberObj // let A: string | number

매핑 타입

  • 새로운 타입을 만들때 기존 타입과 중복되는 부분이 많은 경우 사용
// 예제
type OptionsFlag<T> = {
  [Property in keyof T]: boolean;
}
type Input =
{
  value: string;
  onChange = () => void;
  disabled: boolean;
}
type InputOptions = OptionsFlag<Input>; // InputOptions는 Input의 모든 타입이 boolean으로 변경된 타입을 가짐

조건부 타입

  • 타입을 조건적으로 부여
// 예제
interface IdLabel {
  id: number;
}
interface NameLabel {
  name: string;
}
type NameOrId<T extends number | string> = T extends number ? IdLabel : NameLabel;
  • 분산조건부 타입
    • 제네릭 타입 위에서 조건부 타입을 사용하면 분산적으로 (분배법칙처럼) 동작한다
// 예제
type T = number | boolean;
type Test<T> = T extends number ? T : null;
type A = Test<T> // number | boolean
  • 조건부 타입의 추론
    • infer (런타임에서 타입을 추론)

유틸리티 타입

  • 타입스크립트에서 만들어놓은 타입
    • Partial = 모든 속성이 옵셔널로 변경된 타입을 반환
    • Readonly = 모든 속성이 readonly 변경된 타입을 반환
    • Record<K,T> = 속성의 키가 K이고 속성의 값이 T인 타입을 반환
    • Pick<T,K> = 리터럴 타입으로 T 타입의 부분적인 프로퍼티들을 K로 명시한 후 선택해 타입을 반환
    • Omit<T,K> = 리터럴 타입으로 제외할 T 타입의 부분적인 프로퍼티들을 K로 명시한 후 타입을 반환
    • Exclude<T,U> = T 타입에서 U 타입을 제외한 타입을 반환 (T는 Union)
    • Extract<T,U> = U에 할당 가능한 모든 유니온 멤버를 T에서 가져와서 반환
    • Nonnullable = T에서 null과 undefined를 제외한 타입을 반환
    • Parameters = 함수의 매개변수에 사용된 타입을 튜플 타입으로 반환
    • ReturnType = 함수의 리턴타입을 반환
    • Required = 모든 속성이 required로 변경된 타입을 반환

😊