source-code/TypeScript
ts-all-in-one : utility types
maleefes
2023. 1. 9. 14:10
https://github.com/ZeroCho/ts-all-in-one
utility types
객체의 type을 조작할 때 유용한 타입!
https://www.typescriptlang.org/docs/handbook/utility-types.html
Documentation - Utility Types
Types which are globally included in TypeScript
www.typescriptlang.org
interface Profile {
name : string;
age : number:
married : boolean;
}
- Partial
- 뒤의 타입 속 모든 속성을(필수값이더라도) 옵셔널로 변환
type Partial<T> = {
[P in keyof T]?: T[P];
};
// 예제
const lee: Partial<Profile> = {
name : 'lee';
age : 27;
married : false;
}
- Pick
- 특정 속성만 가져옴
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// 예제
const lee: Pick<Profile, 'name' | 'age'> = {
name : 'lee';
age : 27;
}
- Extract
- key값들 중, 특정 key를 추출
type Extract<T, U> = T extends U ? T : never;
// 예제
type NameAgeProfile = Extract<keyof Profile, 'name' | 'age'>
- Exclude
- key값들 중, 특정 key를 제외하고 추출
type Exclude<T, U> = T extends U ? never : T;
// 예제
type NameAgeProfile = Exclude<keyof Profile, 'married'>
- Omit
- 특정 속성만 제외하고 가져옴
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
// 제외할 Type을 빼로 Pick 해주는 게 -> Omit!
// 여기서 keyof any는? -> 해당 타입(K)이 string | number | symbol 임을 타이핑
// => 객체의 key는 string, number, symbol만 가능하기 때문
// 예제
const lee: Omit<Profile, 'married'> = {
name : 'lee';
age : 27;
}
- Required
- 특정 타입을 필수로 지정
type Required<T> = {
[P in keyof T]-?: T[P];
// -? : key들을 가져올 때, 옵셔널을 제하고 가져와라
// ? 도 사실은 +? 를 줄인 것!
};
- readonly
type Readonly<T> = {
readonly [P in keyof T]: T[P];
// key들을 가져올 때, readonly를 붙혀 가져오는 것
};
- Record
- 객체를 표현하는 한 가지 방법
type Record<K extends keyof any, T> = {
[P in K]: T;
};
// 예제
// 다음과 같은 상황에서
interface Obj {
[key: string] : number
}
const a: Obj = {
'one' : 1
}
// Record로 표현 가능!
const a: Record<string, number> = {
'one' : 1
}
- NonNullable
- 속성 중 null과 undefined를 빼고 싶을 때 사용
type NonNullable<T> = T extends null | undefined ? never : T;
// 예제
type Types = string | number | null
type NonnullTypes = NonNullable<Types> // string | number
- Parameters
- 매개변수들의 type을 가져올 때 사용
- type이 담긴 튜플이 반환됨
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
// 예제
type Params = Parameters<typeof fun>;
const a = Params[0] // 0번째 매개변수의 type
더보기
infer
extends에서만 사용- ts가 알아서 추론하는 것!
Parameters 예제에서는 → 매개변수(args)의 타입을 추론해서 있으면 해당 타입을, 없으면 never 타입을 반환
- ReturnType
- 함수의 return값의 type을 가져올 때 사용됨
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
- ConstructorParameters
- InstanceType
- 각각 생성자, 인스턴스의 type을 가져올 때 사용됨
type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;
type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;