😊
TypeScript - part 2
November 20, 2022
타입 가드
- 타입을 걸러내는 것을 말함
타입 단언
- 타입 추론이 정확하지 않을때 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로 변경된 타입을 반환
끝
😊