TIL( TypeScript - Utility type )

2024. 7. 2. 20:08ใ†TIL

 

๐Ÿ’กTypeScript - ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Utility type ์ •๋ฆฌ

 

์ฐธ์กฐ: https://velog.io/@njt6419/Typescirpt-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85

 

-  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์ด๋ž€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž…์œผ๋กœ, ๊ธฐ์กด ํƒ€์ž…์„ ๋ณ€ํ˜•ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์„  ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํƒ€์ž…์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

 

โ€ข Partial :  ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ์„ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค

interface Profile {
    name: string;
    age: number;
    married: boolean;
}
const newPerson: Partial<Profile> = {
    name: 'john',
    age: 29,
};

 

โ€ข Required: ๋ชจ๋“  ์„ ํƒ์  ์†์„ฑ์„ ํ•„์ˆ˜๋กœ ๋งŒ๋“ ๋‹ค.

interface Profile {
    name?: string;
    age?: number;
    married?: boolean;
}
//Required ๊ตฌํ˜„
type R<T> = {
	[Key in Keyof T]-?: T[Key];
}
const newPerson: Partial<Profile> = {
    name: 'john',
    age: 29,
    married: true,
};

 

โ€ข Readonly: ๋ชจ๋“  ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

// Readonly<T> ๊ตฌํ˜„
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};
interface Profile {
    name: string;
    age: number;
    married: boolean;
}
const readonlyProfile: Readonly<Profile> = {
    name: 'john',
    age: 29,
    married: true,
};

 

โ€ข Pick

- Pick<T, K> : T ํƒ€์ž…์—์„œ K ์†์„ฑ๋งŒ ์„ ํƒํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค.

//pick<T, K> ๊ตฌํ˜„
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};
interface Profile {
    name: string;
    age: number;
    married: boolean;
}
type NameAndAge = Pick<Profile, 'name' | 'age'>;

const person: NameAndAge = {
    name: 'john',
    age: 29,
};

 

โ€ข Omit

- Omit<T, K> : T ํƒ€์ž…์—์„œ K ์†์„ฑ์„ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค.

//Omit ๊ตฌํ˜„<T, K>
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
interface Profile {
    name: string;
    age: number;
    married: boolean;
}
const newPerson1: Omit<Profile, 'married'> = {
    name: 'jun',
    age: 30,
};

 

โ€ข Record

-  Record<K, T> : ํŠน์ • ํ‚ค ํƒ€์ž… K์™€ ๊ฐ’ ํƒ€์ž… T๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค.

type R<T extends keyof any, S> = {   //extends keyof any=> key์•ˆ์— ์ œํ•œ์กฐ๊ฑด์„ ๋„ฃ์–ด์ค€๋‹ค.
	[Key in T] : S;
}
const a: Record<string, number> = { a:3, b:5, c: 7};

 

โ€ข  Exclude

- Exclude<T, K > : T ํƒ€์ž…์—์„œ K ํƒ€์ž…์„ ์ œ์™ธํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค.

//Exclude<T, K> ๊ตฌํ˜„
type Exclude<T, K> = T extends K ? never : T;

type Animal = 'Cat' | 'Dog' | 'Human';
type Mammal = Exclude<Animal, 'Human'>; // => Mammal ํƒ€์ž…์€ 'Cat' | 'Dog'

 

โ€ข  Extract

- Extract<T, K > : T ํƒ€์ž…์—์„œ K ํƒ€์ž…๊ณผ ๊ฒน์น˜๋Š” ํƒ€์ž…์„ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค.

//Extract<T, K>๊ตฌํ˜„ 
type Extract<T, K> = T extends K ? T : never;

type Animal = 'Cat' | 'Dog' | 'Human';
type DomesticAnimal = 'Dog' | 'Cat';

type CommonAnimal = Extract<Animal, DomesticAnimal>; // 'Cat' | 'Dog' // ๋‘๊ฐœ์˜ ํƒ€์ž…์—์„œ ๊ฒน์น˜๋Š” ํƒ€์ž…!

 

โ€ข  ReturnType

- ReturnType<T> : ํ•จ์ˆ˜ ํƒ€์ž… T์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

//ReturnType<T> ๊ตฌํ˜„
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

function getUser() {
    return {
        name: 'john',
        age: 29,
    };
}
type User = ReturnType<typeof getUser>; //=>  { name: string; age: number; }

'TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIL( Nest.js - IoC, DI )  (0) 2024.07.04
TIL (DTO)  (0) 2024.07.03
TIL ( ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ - ts )  (0) 2024.07.01
TIL ( prisma ์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL) ์—ฐ๊ฒฐํ•˜๊ธฐ )  (0) 2024.06.28
TIL( TypeScriptํ•™์Šต )  (0) 2024.06.27