SPACE RUMI

Hi, I am rumi. Let's Splattack!

[STUDY] 스터디/TypeScript

TypeScript utility type / 타입스크립트 유틸리티 타입

백루미 2023. 6. 23. 00:05
반응형

Partial<T>

T의 모든 프로퍼티를 옵셔널로 만드는 타입.

interface Product{
    id: number;
    name: string;
}

const updateProduct(product:Product, updateProduct:Partial<Product>){
	return {...product, ...updateProduct};
}

const product1 = {
    id:1;
    name:'new desk';
}

const product2 = updateProduct(product1, {name:'old desk'});

updateProduct 함수는, 첫번째 매개변수를 두번째 매개변수로 덮어씌우는 함수다.
product2는 product1에 name을 'old desk' 로 변경했다. <T><{name:string}> 인 셈이다.

 

Readonly<T>

T의 모든 프로퍼티를 readonly로 구성한 타입.

interface Product{
    id: number;
}


const product: Readonly<Product> = {
	id: 99
}

product.id = 98 // Cannot assign to 'id' because it is a read-only property.

id는 read-only property이기때문에 재할당되지 않는다.

 

Record<T, K>

타입 T의 프로퍼티들 집합 K로 타입을 구성한다.

interface Product{
  name: string;
}

type ProductName = 'cup' | 'monitor' | 'keyboard'

const productList: Record<ProductName, Product> = {
  cup:{name:'nice cup'},
  monitor:{name:'big monitor'},
  keyboard:{name:'blue keyboard'}
}

productList 는, ProductName인 cup, monitor, keyboard 라는 이름으로 프로퍼티를 만들고,
그 값은 맨 윗줄에 선언한 Product 타입을 가진다.

 

Pick<T, K>

타입 T에서 프로퍼티 K들을 골라 새로운 타입을 구성한다.

interface Product{
  id:number;
  name: string;
  description:string;
}

type LightProduct= Pick<Product, 'id'>;

const firstProduct: LightProduct = {
  id:99
}

LightProductid 프로퍼티만을 가진 타입이다.
K T의 프로퍼티 갯수보다 항상 작거나 같다. 

 

Omit<T,K>

타입 T에서 모든 프로퍼티를 선택한 다음, K를 제거해 타입을 구성한다.

interface Product{
  id:number;
  name: string;
  description:string;
}

type LightProduct= Omit<Product, 'description'>;

const todo: LightProduct = {
  id:99,
  name:'removed description'
}
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>{}

type ExcludedProps =  'isOpen'  | 'onClick'  | 'color';

type Props = Omit<ButtonProps, ExcludedProps>

 

ButtonProps는 버튼의 HTML 어트리뷰트를 모두 포함하고있고, Omit을 통해 ExcludedProps로 선언된 3개의 prop을 제거하고있다.

 

Exclude<T, U>

타입 T에서 U를 제거한 타입을 구성

type A = Exclude<"a" | "b" | "c", "c">;

const alphabet1: A = 'a';
const alphabet2: A = 'b';
const alphabet3: A = 'c'; // Type '"c"' is not assignable to type 'A'.

A는 'a', 'b', 'c' 에서 'c'를 제거한 타입이다. 'a' 또는 'b'가 될수있다.

 

Extract<T, U>

타입 T에서 U를 찾아 타입을 구성한다. 쉽게말해 T와 U의 교집합으로 구성된다.

type A = Extract<"a" | "b" , "b" | "d">;

const alphabet1: A = 'a'; // Type '"a"' is not assignable to type '"b"'.
const alphabet2: A = 'b';
const alphabet3: A = 'c'; // Type '"c"' is not assignable to type '"b"'.

 

NonNullable<T>

타입 T에서 nullundefiend 이 아닌 타입으로 구성.

type A = NonNullable<string|number|undefined>;

const alphabet1: A = null; //Type 'null' is not assignable to type 'A'.
const alphabet2: A = 'a';
const alphabet3: A = '1';

 

Parameters<T>

함수타입 T의 매개변수 타입들의 튜플로 타입을 구성.

declare function test(obj: { a: number, b: string }): void;
type A = Parameters<() => string>;  // 매개변수 없음 []
type B = Parameters<(a: string) => void>;  // 매개변수 a는 [string]
type C = Parameters<(<T>(obj: T) => T)>;  // 매개변수 T는 [unknown]
type D = Parameters<typeof test>;  // obj는 [{ a: number, b: string }]
type E = Parameters<any>;  // any는 unknown[]
type F = Parameters<never>;  // never
type G = Parameters<string>;  // Type 'string' does not satisfy the constraint '(...args: any) => any'.
type H = Parameters<Function>;  // Type 'Function' does not satisfy the constraint '(...args: any) => any'.

 

ConstructorParameters<T>

생성자 함수타입의 매개변수 타입을 추출할수 있게 해준다. 모든 매개변수 타입을 가진 튜플로 타입을 구성.

type A = ConstructorParameters<ErrorConstructor>;  // [(string | undefined)?]
type B = ConstructorParameters<FunctionConstructor>;  // string[]
type C = ConstructorParameters<RegExpConstructor>;  // [string, (string | undefined)?]

const testA:A = [undefined]
const testAA:A = []

const testB:B = ['test', 'testB']
const testC:C = ['test', undefined];

 

ReturnType<T>

함수의 리턴타입으로 타입을 구성.

declare function testA(): {a:string, b:number};

type A = ReturnType<() => string>;  // string;
type B = ReturnType<(a: string) => void>;  // void
type C = ReturnType<(<T>() => T)>;  // {}
type D = ReturnType<typeof testA>;  // { a: number, b: string }
type E = ReturnType<any>;  // any
type F = ReturnType<never>;  // any
type G = Parameters<string>;  // 에러
type H = Parameters<Function>;  // 에러

 

Required<T>

T의 모든 프로퍼티가 필수인 타입을 구성

const product:Required<Product> = {
  id:3,
}
// Property 'name' is missing in type '{ id: number; }' but required in type 'Required<Product>'.

 

깨알상식)
T는 Type, K는 Key, U는 Union 의 약자다. (이 자리에는 아무값이나 써도 된다.)
관습적으로 I는 Input의 의미로 O는 output의 의미로 사용한다.

반응형