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;