๋งต๋ ํ์ ์ ๊ธฐ์กด ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ํ์ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ map() ํจ์๋ฅผ ํ์ ์ ์ ์ฉํ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ง๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ for in ๋ฌธ๋ฒ๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๋ฉฐ, Kํ์ ์ ๊ฐ์ ๊ฐ๊ฐ ์ํํ์ฌ Tํ์ ์ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฒด์ ํค๋ก ์ ์๊ฐ ๋๋ค.
{ [ P in K ] : T }
{ [ P in K ]? : T }
{ readonly [ P in K ] : T }
{ readonly [ P in K ]? : T }
type Person = {
name: string;
age: number;
};
// ์ ํธ๋ฆฌํฐํ์
Partial<Person>๊ณผ ๋์ผ
type PartialPerson = {
[K in keyof Person]?: Person[K];
};
type User = {
name?: string;
age?: number;
};
// ์ ํธ๋ฆฌํฐํ์
Required<User>์ ๋์ผ
type RequiredUser = {
[K in keyof User]-?: User[K];
};
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
type NameOnly = Pick<Person, 'name'>;
type ReadonlyPerson = {
readonly [K in keyof Person]: Person[K];
};
// ๊ฒฐ๊ณผ:
// {
// readonly name: string;
// readonly age: number;
// }
type Stringify<T> = {
[K in keyof T]: string;
};
type StringifiedPerson = Stringify<Person>;
// ๊ฒฐ๊ณผ:
// {
// name: string;
// age: string;
// }
// ๋ง์ฝ ์์ฑ์ ํ์
์ดย nullย ๋๋ย undefined๋ฅผ ํฌํจํ๋ฉดย never๋ก ๋ณ๊ฒฝํ์ฌ ํ์
์ ๊ฑฐ ํจ๊ณผ
type NonNullable<T> = {
[K in keyof T]: T[K] extends null | undefined ? never : T[K];
};
type User = {
name: string | null;
age: number | undefined;
email: string;
};
type NonNullableUser = NonNullable<User>;
// ๊ฒฐ๊ณผ:
// {
// name: string; // null์ด ์ ๊ฑฐ๋จ
// age: number; // undefined๊ฐ ์ ๊ฑฐ๋จ
// email: string; // ๋ณ๊ฒฝ ์์
// }