κΉν TIL λ ν¬μ κΈ°λ‘νλ λ΄μ©μ μ 리νμ¬ λΈλ‘κΉ ν©λλ€.
λμ μΌλ‘ νμ μ μΆλ‘ νλ μ λ€λ¦
μ λ€λ¦ λ¬Έλ²μ κ°μ κ·μΉμ μ¬λ¬ νμ
μ λμΌνκ² μ μ©ν μ μλλ‘ λμμ€λ€. νμ
μ λ³΄κ° λμ μΌλ‘ κ²°μ λκ² νλ μμμ΄κΈ° λλ¬Έμ΄λ€. κ³ μ λ νμ
μ λ§μΆ°μ μ¬μ©νλ κ²λ³΄λ€ μ μ°νλ€. μ λ€λ¦ λ¬Έλ²μ μ μ©νμ§ μκ³ , ν¨μμ μ
λ ₯κ°κ³Ό λ°νκ°μ νμ
μ μΆμ νλλ‘ μ½λλ₯Ό μμ±νλ©΄ μ λ€λ¦μ΄ μΌλ§λ νΈνμ§ μ μ μλ€. (κ°μΈμ μΌλ‘ μ λ€λ¦μ΄ νμ
μ€ν¬λ¦½νΈμμ μ μΌ μΉμν λ¬Έλ² κ°λ€.)
function makeArray(defaultValue: string, size: number): string[];
function makeArray(defaultValue: number, size: number): number[];
function makeArray(
defaultValue: number | string,
size: number
): Array<string | number> {
const arr: Array<string | number> = [];
for (let i = 0; i < size; i += 1) {
arr.push(defaultValue);
}
return arr;
}
makeArray(1, 5); // Array<number>
makeArray('hi', 5); // Array<stirng>
μμ μ½λμμ makeArray
ν¨μλ μ
λ ₯νλ defaultValueμ νμ
ννμ λ°λΌμ λ°νκ°μ μμμ μΆμ ν΄μ λ°ννλ€. νμ§λ§, defaultValueμ νμν νμ
μ΄ λμ΄λκ² λλ€λ©΄ νμ
μ λν μ μλ₯Ό μλμ²λΌ νλνλ ν΄μ£Όμ΄μΌ νλ€.
function makeArray(defaultVaule: boolean, size: number): boolean[];
function makeArray(defaultValue: number | string | boolean ...): Array <string | number | boolean> {};
λ°λ³΅μ λΆνΈν΄μΌ νλ€.
μ λ€λ¦ λ¬Έλ²μ νμ©νλ©΄ μμ makeArray
ν¨μμ μ
λ ₯κ°μ λν 리ν΄κ° νμ
μΆμ μ μ½κ² ν μ μλ€. μ½κ² ν μ μλ€λ λ§μ ν¨μμ νμ
μ μΌμΌμ΄ μ§μ ν νμκ° μλ€λ κ²μ΄λ€. μ λ€λ¦ λ¬Έλ²μ < >
κΈ°νΈ μμ νμ
μ 보λ₯Ό μ
λ ₯νλ μμΌλ‘ μ¬μ©ν μ μλ€.
function makeArray2<T>(defaultValue: T, size: number): T[] {
const arr: T[] = [];
for (let i = 0; i < size; i += 1) {
arr.push(defaultValue);
}
return arr;
}
const arr1 = makeArray2<string>('hi', 5);
const arr2 = makeArray2('hi', 5); // νμ
μ μμμ μΆμ ν΄μ€λ€.
μμμ κ³μ λ°λ³΅μ μΌλ‘ λμΌν μ½λλ₯Ό μμ±ν΄μΌ νλ λΆνΈμ μ λ€λ¦ λ¬Έλ²μΌλ‘ μ½κ² μΆμ μν¬ μ μλ€.
μ λ€λ¦μΌλ‘ μλ£κ΅¬μ‘° Stack ꡬνν΄λ³΄κΈ°
μ λ€λ¦μΌλ‘ μλ£κ΅¬μ‘°λ₯Ό ꡬννλ©΄ νΈνλ€. μ΅κ·Όμ λ€μ΄μ¨ λ°μ΄ν°λ₯Ό κ°μ₯ λ¨Όμ λ΄λ³΄λ΄μ£Όλ Stack
μλ£κ΅¬μ‘°λ₯Ό μ λ€λ¦μΌλ‘ κ°λ³κ² ꡬνν΄λ³Έλ€.
class Stack<D> {
private items: D[] = [];
push(item: D) {
this.items.push(item);
}
pop() {
return this.items.pop();
}
}
const numStack = new Stack<number>();
numStack.push(10);
let strStack: Stack<string>;
strStack = numStack; // Error
μ μ°ν¨μλ μ μ½μ΄ νμν λκ° μλ€.
νΉμ λΌμ΄λΈλ¬λ¦¬λ νλ μμν¬λ ν¨μμ μ
λ ₯λ°μ μ μλ νμ
μ μ νμ λλ κ²½μ°κ° μλ€. μλ₯Όλ€μ΄, 리μ‘νΈμ μμ±κ°(props)λ κ°μ²΄ νμ
λ§ νμ©μ΄ λλ€. κ·Έλμ μ»΄ν¬λνΈ ν¨μμ μ λ€λ¦ λ¬Έλ²μ μ¬μ©ν κ²½μ° μ°λ¦¬λ νμ
μ μ νμν¬ μ μμ΄μΌ νλ€.
νμ
μ€ν¬λ¦½νΈλ λλν΄μ μ λ€λ¦μλ νμ
μ μ νμν¬ μ μλ μ₯μΉλ₯Ό ꡬλΉνκ³ μλ€. extends
ν€μλλ₯Ό μ΄μ©ν΄μ μ λ€λ¦μ΄ μΆμ ν μ μλ νμ
μ μ’
λ₯λ₯Ό μ νν μ μλ€. <T extends number | string>
μ΄λ κ² μ λ€λ¦μ μ μνλ©΄ <T>
κ° μΆμ ν μ μλ νμ
μ number, stringμΌλ‘ κ΅νλλ€. Tκ° number λλ stringμ ν λΉ κ°λ₯ν΄μΌ νλ€κ³ μκ°νλ©΄ λλ€.
interface Animal {
kindOf: string;
age: number;
}
interface Shark extends Animal {
habitat: string;
}
// keyof νμ
ννλ‘ μμ±μ΄ λλ©΄, νμ
μ μλ μμ± μ΄λ¦μ ν λΉ κ°λ₯ν νμ
μ΄λΌλ λ».
// μ¬κΈ°μλ Animalμ kindOf λλ ageλ‘ νμ
μ΄ μ ν΄μ ΈμΌ νλ€.
function swapProperty<T extends Animal, K extends keyof Animal>(
p1: T,
p2: T,
key: K
): void {
const temp = p1[key];
p1[key] = p2[key];
p2[key] = temp;
}
const p1: Shark = {
kindOf: 'fish',
age: 100,
habitat: 'deepSea'
};
const p2: Shark = {
kindOf: 'whale',
age: 190,
habitat: 'shallowSea'
};
swapProperty(p1, p2, 'age');
swapProperty(p1, p2, 'habitat'); // Error : Animalμλ habitatμ΄λΌλ νμ
ν€κ° μκΈ° λλ¬Έ!
νμ μ€ν¬λ¦½νΈ 맡λ νμ
맡λ νμ μ κΈ°λ³Έ λ¬Έλ²
맡λ νμ
μ κΈ°λ³Έμ μΌλ‘ κ°μ²΄ ννμ νμ
μ΄λ€. κ·Έλμ μΈν°νμ΄μ€μ κ°μ΄ κ°μ²΄ ννμ νμ
μ μ΄λ€ μ²λ¦¬λ₯Ό ν΄μ£ΌκΈ° μν΄μ μ¬μ©λλ€. 보ν΅, μΈν°νμ΄μ€μ μμ±λ€μ readonly, optional μμ±μΌλ‘ λ³κ²½νλ λ°©μμΌλ‘ μ¬μ©λλ€.
μ¬μ©νλ λ°©λ²μ μ€κ΄νΈ({})μμ λκ΄νΈ([])λ‘ μμ±μ νκΈ°νλ λ°©μμ μ¬μ©νλ€. μ λ€λ¦ μ²λΌ νμ
μ μ΄λ¦μ κ°λ°μκ° μ§μ νκ³ in
μ΄λΌκ³ νλ ν€μλλ‘ μμ±μ μ΄λ¦μ λ€μμ€λ κ²λ€λ‘ μΉννλ€κ³ μκ°νλ©΄ νΈνλ€. κ·Έλ¬λ©΄ λκ΄νΈ λ°μμ μ μλ νμ
μ΄ κ·Έ μμ±λ€μ νμ
μ΄ λλ€.
// λκ°μ T1μ κ°μ νκΈ°μ΄λ€.
type T1 = { [K in 'prop1' | 'prop2']: boolean };
type T1 = {
prop1: boolean;
prop2: boolean;
};
λ§μΉ ν¨μμ²λΌ μ¬μ©λλ νμ
μ΄λΌ 'μ νΈλ¦¬ν° νμ
'μ΄λΌκ³ λΆλ¦°λ€.
μΈν°νμ΄μ€μ λͺ¨λ μμ±μ νμ
μ μ ν λ€λ₯Έ νμ
μΌλ‘ ν λ²μ λ°κΏλλ 맡λ νμ
μ΄ μ¬μ©λλ€. μλμ μ½λ μμλ₯Ό ν λ² λ³΄μ.
interface Shark {
name: string;
age: number;
}
type MakeType<T> = { [K in keyof T]?: boolean };
const sharkMap: MakeType<Shark> = {};
sharkMap.name = true;
sharkMap.age = 123; // Error: number νμ
μ λΆλ¦° νμ
μ ν λΉλ μ μμ΅λλ€.
MakeType
μ΄λΌλ νμ
μ μ λ€λ¦μΌλ‘ νΉμ μΈν°νμ΄μ€ λλ κ°μ²΄λ₯Ό λ°μμ κ·Έ μΈν°νμ΄μ€μ μμ±μ μ΅μ
λνκ² λ§λ€κ³ λΆλ¦° νμ
μ ν λΉνκ² νλ€. μ°λ¦¬μ μΉμ ν VSCodeλ μ΄ νμ
μ λ³νμ μ μΊμΉνλ€.
μμ±μ νμ μ μ μ§νλ©΄μ λ³νμ£ΌκΈ°
μμ μμμ²λΌ μΈν°νμ΄μ€λ κ°μ²΄μ μμ±λ€μ λν νμ
μ μΌκ΄μ μΌλ‘ λ³κ²½ν λλ§ λ§΅λ νμ
μ μ¬μ©νμ§λ μλλ€. μ€νλ € μμ±λ€μ νμ
μ μ μ§νλ©΄μ readonly κ°μ μ£Όκ±°λ optionalν μμ±μΌλ‘ λ§λ€ νμλ μλ€. κ·Έλ° μ²λ¦¬ μμ 맡λ νμ
μΌλ‘ νλ©΄ νΈνλ€.
type Readonly<T> = { readonly [P in keyof T]: T[P] };
type Partial<T> = { [P in keyof T]?: T[P] };
type T1 = Readonly<Shark>;
type T2 = Partial<Shark>;
μμ μ½λμμ T[P]
λΌλ λ¬Έλ²μ΄ μ λ€λ¦μΌλ‘ λλ¬μΈμ¬μ μ‘°κΈ μ΄ν΄νκΈ° νλ€ μ μλ€. κ°λ¨νκ² λμ
μ λ°©μμ λ μ¬λ €λ³΄λ©΄ μ’λ€. Tμλ κ°μ²΄λ μΈν°νμ΄μ€κ° λμ
λ κ²μ΄λ€. Pλ keyof
ν€μλλ‘ Tμ λμ
λ μΈν°νμ΄μ€λ κ°μ²΄μ μμ± μ΄λ¦λ€μ΄ κ°κ° λμ
λλ€. κ·Έλμ T[P]
λΌκ³ λ λΆλΆμ λ―μ΄λ³΄λ©΄ 'μΈν°νμ΄μ€[key]'μ νμ
μ λμ΄λΌ λΌλ λ»μ΄λ€.
κ·Έλμ μμ T1μ Shark μΈν°νμ΄μ€μ μμ±λ€μ νμ μ μ μ§νλ©΄μ, κ° μμ±μ readonly μμ±μ λΆμ¬νλ€. T2λ μ΅μ λ μμ±μΌλ‘ λ³κ²½νμ λΏμ΄λ€.
νμ μ€ν¬λ¦½νΈμ κΈ°λ³Έ λ΄μ₯ 맡λνμ
μμμ κ°λ¨νκ² κ΅¬μΆν΄λ³Έ Readonly<T>
μ Partial<T>
λ νμ
μ€ν¬λ¦½νΈκ° κΈ°λ³Έμ μΌλ‘ κ°μ§κ³ μλ λ΄μ₯ν 맡λνμ
μ΄λ€. κ·Έλμ μμμ μ²λΌ λ°λ‘ νμ
μ μ μνμ§ μκ³ , λ°λ‘ μ¬μ©ν μ μλ€.
λ λ€λ₯Έ λ΄μ₯ 맡λ νμ
μλ Pick
μ΄ μλ€. μ΄κ²μ μΈν°νμ΄μ€λ κ°μ²΄μ λν΄μ νμ μνμ λ§λλ λλμ 맡λ νμ
μ΄λ€. μλμ μμ μ½λλ‘ νμ
ν΄λ³΄μ.
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
type T3 = Pick<Shark, 'age'>;
type T4 = Pick<Shark, 'age' | 'name'>;
μ λ€λ¦μ 첫 μμλ νμμνμ λ§λ€ μΈν°νμ΄μ€(T)κ° μ¨λ€. λ€μ μμλ‘λ κ·Έ μΈν°νμ΄μ€μ ν€λ€μ μλ―Ένλ KλΌλ μμκ° Tμ νμ₯μ±μ μ μ§νμ±λ‘ μ¨λ€. 맡λ νμ
μ μ μλΆλΆμ 보면 Pλ Kμ μ λμ¨λ€λ‘ ꡬμ±λκ³ μΈν°νμ΄μ€μ νμ
μ μ μ§λλ κ²μ μ μ μλ€.
κ·Έλμ T3λΌκ³ νλ νμ
μ Shark μΈν°νμ΄μ€μ λͺ¨λ μμ±μΈ name, age
λ₯Ό κ°μ§ μλ μκ³ , μμμμ²λΌ age
λ§ κ°μ§ μλ μλ€.
λ λ€λ₯Έ λ΄μ₯ 맡λ νμ
μλ Record
κ° μλ€. μμ μ½λλ‘ νμ
ν΄λ³΄μ.
type Record<K extends number, T> = { [P in K]: T };
type T4 = Recorded<3 | 5, Shark>;
Record 맡λ νμ
λ μμ μ λ€λ¦μΌλ‘ κ·Έ μ¬μ©μ±μ λνλΌ μ μλ€. 첫 μμμλ μλ‘μ΄ μΈν°νμ΄μ€μ λ°μν μμ±κ°μ μ λμ¨ ννλ‘ λ£μ΄μ, μ΄κ² μ΄λ€ νμ
μΌλ‘ νμ₯λ κ²μΈμ§ μΈμμμΌμΌ νλ€. μμ μ½λμμλ number νμ
μ ν λΉ κ°λ₯ν Kλ€μ μ
λ ₯ν΄μΌ νλ€.
κ·Έλ¦¬κ³ μ λ€λ¦μ λλ²μ§Έ μμμ νμ
μΌλ‘ λ£κ³ μΆμ μΈν°νμ΄μ€ λλ νμ
μ λ£μ΄μ κ° μμ±μ΄ μ΄λ€ νμ
μ μ§λκ² νλμ§ μλ €μ€λ€. μμ μ½λμμλ SharkλΌκ³ νλ μΈν°νμ΄μ€ νμ
μ λ£μλ€. κ·Έλμ κ²°κ³Όμ μΌλ‘
interface T4 {
3: Shark;
5: Shark;
}
λΌλ νμ μ΄ μ μ λ κ²κ³Ό λ§μ°¬κ°μ§λ€.
맡λ νμ μΌλ‘ Enum νμ ꡬμ±μ μ€μ μ€μ΄κΈ°
맡λ νμ
μΌλ‘ μ΄λ νμ
μ μ‘°κΈ νΈνκ²(?) κ΄λ¦¬ν μ μλ€. λκ΄νΈ μμμ λ°λ³΅νλ μμμ μ΄λ νμ
μ λ£μ΄μ λΉ μ§ μμκ° μλμ§ νμΈνλ λ°©μμΌλ‘ 맡λ νμ
μ μ¬μ©νλ€. μ§μ μμ μ½λλ₯Ό 보μ.
enum Fruit {
Apple, // 0
Orange,
Banana,
Kiwi
}
const Fruit_Price: { [K in Fruit]: number } = {
[Fruit.Apple]: 1000,
[Fruit.Orange]: 1500,
2: 1200
// Error: Kiwiμ λν κ° μ μκ° μμ΅λλ€.
};
FruitλΌκ³ νλ μ΄λ νμ
μ μμλ€μ Kλ‘ λ°κ³ μλ€. κ·Έ λ κ°κ°μ Kμ λν νμ
μ numberκ° λλ€. κ·Έλμ Fruit μ΄λμ μλ λͺ¨λ μμμ λν μ«μ κ°μ΄ μ μλμ΄μΌ νλ€. [Fruit.Apple]
νμμΌλ‘ λΆμ¬ν΄λ λκ³ , 2: 1200
μ²λΌ μ«μν μ΄λμ νΉμ§μ μ μ΄λ €λ λλ€. λΉ μ§ μμκ° μλ€λ©΄ 맡λ νμ
μ΄ μμμ μλ¬λ₯Ό 보λ΄μ€ κ²μ΄λ€.
νμ μ€ν¬λ¦½νΈ μ‘°κ±΄λΆ νμ
μ‘°κ±΄λΆ νμ κΈ°λ³Έ λ¬Έλ²
μλ°μ€ν¬λ¦½νΈμ μΌνμ°μ°μμ μκΉμκ° λΉμ·ν νμ
μ μκ° νμ
μ€ν¬λ¦½νΈμλ μλ€. μ‘°κ±΄λΆ νμ
μ΄ κ·Έκ²μ΄λ€. κΈ°λ³Έ λ¬Έλ²μ T extends U ? X : Y
μ ννλ€. μ λ§ μΌνμ°μ°μμ κ±°μ λμΌν λͺ¨μμ΄λ€. μ΄λ μ£Όμν μ μ μΌνμ°μ°μκ° μ‘°κ±΄μ λ°λΌ λ€λ₯Έ κ°μ λΆμ¬νλ€λ©΄, μ‘°κ±΄λΆ νμ
μ λ€λ₯Έ νμ
μ λΆμ¬νλ€λ μ΄μΌκΈ°λ€. μ λ€λ¦ Tκ° U νμ
μ ν λΉμ΄ κ°λ₯νλ€λ©΄ (Tμ νμ
λ²μκ° Uλ³΄λ€ μλ€λ©΄) X νμ
μ κ°μ§κ³ , κ·Έλ μ§ μμΌλ©΄ Y νμ
μ κ°μ§λ€.
μ‘°κ±΄λΆ νμ
μμ μ λμ¨ νμ
μ μ μ©νκ² λλ©΄ μ°λ¦¬κ° μλ μ λμ¨ νμ
μ±λ¦½κ³Ό μ‘°κΈ λ€λ₯Έ κ²°κ³Όκ° λμ¨λ€. μλμ μ½λλ₯Ό 보μ.
type IsStringType<T> = T extends string ? 'string' : 'not string';
type T1 = IsStringType<string | number>; // string | not string
type T2 = IsStringType<string> | IsStringType<number>; // = T1
νμ
T1μ κ²½μ° string | number
κ° string νμ
λ³΄λ€ λ²μκ° ν¬κΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘ string νμ
μ ν λΉμ΄ λΆκ°νλ€. κ·Έλμ 'not string' νμ
μ΄ λμ΄μΌ νλ€κ³ μκ°μ΄ λ€μ§λ§, μ‘°κ±΄λΆ νμ
μμ μ λμ¨ νμ
μ μ μ©νλ©΄ λ νμ
μ λͺ¨λ κ°μ§ μ μκ²λλ€. κ·Έλμ μ¬μ€μ T1μ νμ
μ T2μ νμ
μ μ νλ κ²κ³Ό λ°©μμ΄ κ°λ€.
μμ μ½λλ₯Ό μ½κ² μ€λͺ
νλ©΄, Tμ λ€μ΄μ¨ μ λμ¨ νμ
μ κ°κ° stringμ ν λΉν μ μλμ§λ₯Ό λΉκ΅νλ κ²μ΄ μ‘°κ±΄λΆ νμ
μ΄λΌκ³ 보면 λλ€. stringμ ν λΉ κ°λ₯νμ§λ§, numberλ stringμ ν λΉμ΄ λΆκ°νκΈ° λλ¬Έμ T1μ΄ string | not string
μ νμ
μ κ°μ§λ κ²μ΄λ€.
Excludeμ Extract νμ
νμ
μ€ν¬λ¦½νΈ λ΄μ₯ νμ
μ€μ Exclude, Extract νμ
μ΄ μλ€. λ¨μ΄ λ»κ³Ό λΉμ·νκ² λμνλ€. μ΄κ²μ μ‘°κ±΄λΆ νμ
+ μ λμ¨ μ λ€λ¦μΌλ‘ μ½κ² μμ±ν μ μμ΄μ κΈ°λ‘μ ν΄λ³Έλ€. μ΄κ²μ κΈ°λ‘νκΈ°μ μμμ μ λμ¨ νμ
μ 'never' νμ
μ΄ μλ€λ©΄ κ·Έκ²μ μ μΈλλ€.
// Uμ ν λΉ κ°λ₯νμ§ μμ Tλ§ λ¨κ²¨λΌ
type exclude<T, U> = T extends U ? never : T;
type T5 = exclude<1 | 3 | 5 | 7, 1 | 5 | 9>; // 3 | 7
// Uμ ν λΉ κ°λ₯ν Tλ§ λ¨κ²¨λΌ
type extract<T, U> = T extends U ? T : never;
type T6 = extract<1 | 3 | 5 | 7, 1 | 5 | 9>; // 1 | 5
Exclude
νμ μ Uμ ν λΉ κ°λ₯ν Tλ λΉΌκ³ λλ¨Έμ§λ₯Ό νμ μΌλ‘ κ°μ§κ² ν΄μ£Όλ νμ μ΄λ€.<1 | 3 | 5 | 7>
μμ 1, 5λ ν λΉμ΄ κ°λ₯νκΈ° λλ¬Έμ μ μΈνκ³<3 | 7>
λ§ νμ μΌλ‘ λ°μλλ€.Extract
λ Uμ ν λΉ κ°λ₯ν Tλ§ μΆμΆνλ νμ λλ€. μμ μ€λͺ κ³Ό λ°λλ‘ λμνλ€.
ReturnType
ReturnType
μμ νμ
μ€ν¬λ¦½νΈ λ΄μ₯ νμ
μ΄λ€. μ΄λ¦μμ μ μΆν μ μλ―μ΄ ν¨μ νμ
μ 리ν΄κ°μ κ·Έ νμ
μΌλ‘ κ°μ§κ² ν΄μ£Όλ μ νΈλ¦¬ν° νμ
μ΄λ€. λ΄λΆκ° μ‘°κ±΄λΆ νμ
μΌλ‘ ꡬμ±λμ΄ μκΈ° λλ¬Έμ κ°λ¨νκ² μμλ³Ό μ μλ€. ReturnTypeμ μμ보기 μν΄μλ infer
λΌλ ν€μλλ₯Ό μμμΌ νλ€. infer ν€μλ μμ μ¬μ μ μΈ μλ―Έμ λΉμ·νλ°, νμ
μΆλ‘ μ μν΄μ μ¬μ©νλ ν€μλλ‘ λ°νκ°μ μΆλ‘ νλλ° μ¬μ©λλ€. infer ν€μλλ κ°μ΄ μ ν΄μ§μ§ μμ νμ
μμ μμ κ·Έ κ°μ νμ
μ΄ λ¬΄μμΈμ§ μΆλ‘ ν΄μ€λ€. (infer U)[]
λΌκ³ λμ΄ μμΌλ©΄ μΆλ‘ λλ Uμ νμ
μ λ°λ₯Έ λ°°μ΄μ΄ λλ€.
type returntype<T> = T extends (...args: any[]) => infer R ? R : any;
type T7 = returntype<() => string>; // T7: string;
function f1(s: string): number {
return s.length;
}
type T8 = returntype<typeof f1>; // f1μ λ°νκ°μ κ°μ§λ€. T8: number
μμ μ½λμμ μ΄ν΄λ³΄λ©΄, μ λ€λ¦ Tκ° Rμ΄λΌλ νμ
μ λ°ννλ κ²μΌλ‘ μΆλ‘ λλ ν¨μμ ν λΉ κ°λ₯νμ§ μ‘°κ±΄λΆλ‘ νμ
νλ€. ν λΉμ΄ κ°λ₯νλ©΄ κ·Έ νμ
μ Rμ΄ λκ³ κ·Έλ μ§ μμΌλ©΄ anyκ° λ°μλλ€. T8μ νμ
μ κ²°μ νλ λΆλΆμμ ν¨μν νμ
μΈμ§λ₯Ό νμΈνκΈ° μν΄μ typeof
ν€μλλ₯Ό μ¬μ©ν κ²λ νμΈν νμκ° μλ€.
Omit νμ
Omit
νμ
μμ νμ
μ€ν¬λ¦½νΈ λ΄μ₯ νμ
μ€ νλλ€. μ¬μ©μ Omit<T, U>
νμμΌλ‘ νκ³ , μ λ€λ¦ T νμ
μμ Uμ ν€ μμ±μ ν΄λΉνλ κ²μ μ μΈν λλ¨Έμ§λ₯Ό λ°ννλ€. νμ
μ μκ° ν¨μκ° μλμλ λΆκ΅¬νκ³ ν¨μμ κ°μ΄ 무μΈκ°λ₯Ό λ°ννλ λλμ΄ κ°νλ€.
type omit<T, U extends keyof T> = Pick<T, Exclude<keyof T, U>>;
type T11 = omit<Shark, 'name' | 'age'>; // T11: { teeth: boolean }
μμ μ½λμμ Uλ μ λ€λ¦ Tμ μμ± μ΄λ¦λ€ μ€μ ν λΉ κ°λ₯ν μμλ‘ κ΅¬μ±λ μ λμ¨μ΄λ€. κ·Έκ²λ€μ Tμμ Exclude νμ μΌλ‘ μ μΈν΄μ£Όκ³ , λ¨μ κ²μ Pick νλ μμλ‘ λμνλ€. μ½κ² μκ°ν΄μ μΈν°νμ΄μ€μμ νΉμ μμ±μ μ μΈν λλ¨Έμ§λ₯Ό νμ μΌλ‘ κ°μ§κ² ν΄μ£Όλ μ νΈλ¦¬ν° νμ μ΄λ€. 리μ‘νΈμμ propsλ₯Ό λΆλΆμ μΌλ‘ λ°λ μ»΄ν¬λνΈ μ½λμ μ ν©ν κ² κ°λ€.
μ¬λ¬ νμ κ³Ό νΌμ©ν΄μ μ¬μ©νκΈ°
μ‘°κ±΄λΆ νμ
μ μ¬λ¬ λ€λ₯Έ νμ
κ³Ό νΌμ©ν΄μ μλ‘μ΄ μ νΈλ¦¬ν° νμ
μ λ§λ€ λ μ μ©νκ² μ¬μ©λλ€. κ°λ³κ² νλμ μ νΈλ¦¬ν° νμ
μ λ§λ€λ©΄μ μ΄ λΆλΆμ μ΄ν΄ν΄λ³Έλ€. μλμ μ½λλ₯Ό μμμ μΌλ‘ λΆν΄ν΄λ³΄λ©΄μ μ΄ν΄νμ.
type StringPropertyNames<T> = {
[K in keyof T]: T[K] extends string ? K : never;
}[keyof T];
interface Shark {
name: string;
teeth: boolean;
age: string;
}
type T9 = StringPropertyNames<Shark>; // "name" | "age"
StringPropertyNames
λΌκ³ νλ νμ
μ΄ κ²°μ λλ λ°©μμ΄ μ‘°κΈ λ³΅μ‘νλ€. 맡λ νμ
κ³Ό μ‘°κ±΄λΆ νμ
, κ·Έλ¦¬κ³ [keyof T]λΌλ ννκΉμ§.
- μ°μ 맡λ νμ μμ μ λ€λ¦ T νμ μ μμ± μ΄λ¦λ€λ‘ Kκ° κ΅¬μ±λλ€. (μ λμ¨ νμ )
- κ·Έ λμ T[K] μ¦, K μμ±μ νμ κ°μ΄ stringμΈμ§ μλμ§λ₯Ό μ‘°κ±΄λΆ νμ μμ κ²°μ νλ€. stringμ΄λΌλ©΄ Kλ₯Ό νμ μΌλ‘ μ§μ νλκΉ Tμ μμ± μ΄λ¦ μ체λ₯Ό νμ μΌλ‘ λ°°μ νλ€λ λ»μ΄λ€. μλκ²½μ° neverλ‘ μ μΈμν¨λ€.
- [keyof T]λ‘ νμλ λΆλΆμ λ§ κ·Έλλ‘ μ λ€λ¦ Tμ μμ± μ΄λ¦μ μ΄ μ νΈλ¦¬ν° νμ μ΄ λ°ννλ νμ μΌλ‘ μ§μ νκ² λ€λ λ»μ΄λ€.
κ²°κ³Όμ μΌλ‘ Shark μΈν°νμ΄μ€μ μ΄ μ νΈλ¦¬ν° νμ
μ μ μ©νλ©΄ μμ± νμ
μ΄ stringμΈ name, age
κ° κ±Έλ¬μ§κ³ (맡λ & μ‘°κ±΄λΆ νμ
), κ·Έλμ μμ± μ΄λ¦ μμ²΄κ° μ λμ¨ νμμΌλ‘([keyof T]) T9μ νμ
μ λ°μλλ€.