-
1. íì ì í ë¹ ê°ë¥í ê°ë€ì ì§í©
-
1-1. íì ì€ë¥1
-
1-2. íì ì€ë¥2
-
1-3. ê·žëì ì§í©ìŽë?
-
2. íì ì€í¬ëŠœížììì íì (ì§í©)ì ì¢ ë¥
-
2-1. never íì
-
2-2. ì ë(unit) íì
-
2-3. ì ëìš(union) íì
-
2-4. ê·ž ìžì íì ë€
-
3. íì ì€í¬ëŠœížìì ì§í© ê°ì êŽê³
-
3-1. íì ì€í¬ëŠœížììì êµì§í©
-
3-2. íì ì€í¬ëŠœížììì í©ì§í©
-
4. ì ëëŠ íì ììì extends
-
5. ë°°ìŽê³Œ íí ê·žëŠ¬ê³ ížëŠ¬í
-
6. íì ì€í¬ëŠœíž íì ìŽ ëì§ ëª»íë ê°ì ì§í©
1. íì ì í ë¹ ê°ë¥í ê°ë€ì ì§í©
ìë°ì€í¬ëŠœížììë ë³ìì ë€ìí ê°ì í ë¹í ì ìë€. ìŽë¬í ê°ë€ì íì
ì€í¬ëŠœížê° ë°íì ìŽì ì ì¬êž°ì í ë¹í ì ìëê°?
ëŒë ì묞ì íê³ ì€ë¥ë¥Œ 첎í¬íêž° ììíë€.
ì€ë¥ë¥Œ íµíŽ íì ì€í¬ëŠœížììì ì§í©ìŽëŒë ê°ë ì ë€ê°ê°ë³Žì.
1-1. íì ì€ë¥1
íì ì€í¬ëŠœížê° ë§ìœ ì€ë¥ë¥Œ ë°ê²¬íë©Ž ìëì ê°ì ì€ë¥ë¥Œ ë°ê²¬í ì ìë€.

Type 'number' is not assignable to type 'string'.
ì«ì íì
ì 묞ììŽì íì
ì í ë¹ì í ì ìë€ë ê²ìŽë€. ìŽ ë¬žêµ¬ë ì§í©ì êŽì ìì ìëì²ëŒ íŽìí ì ìë€.
- ì«ì íì
ì 묞ììŽ íì
ì
ë¶ë¶ ì§í©
ìŽ ìëë€.(ë íì ì êŽê³)
1-2. íì ì€ë¥2
ë ë€ë¥ž ì€ë¥ë¥Œ 볎며 ì§í©ìŽëŒë ê°ë ì ì ëŠœíŽ ë³Žì.

AB
ì íì
ì "A" ëë "B"ìŽë€. íì§ë§ ê·ž ìŽ ìžì ê°ì í ë¹íêž° ë묞ì ìì ê°ì ì€ë¥ê° ëíëë€. ìŽ ë¬žêµ¬ë ì§í©ì êŽì ìì íŽìíŽ ë³Žë©Ž ìëì ê°ë€.
- "C"íì ì "AB" íì ì ììê° ìëëë€.(ê°ê³Œ íì ì êŽê³)
1-3. ê·žëì ì§í©ìŽë?
type Person = {
name: string,
age: number,
};
Person
ì ìì±ìž name, ageê° ì§í©ìŽ ìëëŒ, Person
ê·ž ìì²Žê° ì§í©ìŽë€.
2. íì ì€í¬ëŠœížììì íì (ì§í©)ì ì¢ ë¥
2-1. never íì
never
íì
ì íì
ì€í¬ëŠœížìì ê°ì¥ ìì ì§í©ìŽë€. never
íì
ìŒë¡ ì ìžë ë³ìì ë²ìë ê³µì§í©ìŽêž° ë묞ì ìë¬Žë° ê°ë í ë¹í ì ìë€.
2-2. ì ë(unit) íì
never
íì
ë€ììŒë¡ ìì ì§í©ì í ê°ì§ ê°ë§ í¬íšíë íì
ìŽë€. ìŽë¥Œ ì ë(unit) ëë 늬í°ëŽ(literal)
íì
ìŽëŒê³ íë€.
type A = 'A';
type B = 'B';
type Twelve = 12;
2-3. ì ëìš(union) íì
ì ë(unit)
íì
ì ì¬ë¬ ê° ë¬¶ìŒë©Ž ì ëìš(union)
íì
ìŽ ëë€. ì ëìš íì
ì ê° ì§í©ë€ì í©ì§í©ì ë»íë€.
type AB = 'A' | 'B';
type Animals = 'Cat' | 'Dog' | 'Bird';
2-4. ê·ž ìžì íì ë€
íí ì°ìŽë number
, string
, boolean
ë±... ìŽë€ë íëì ì§í©ìŽë€. ìŠ, ëìŒí í¹ì§ì 묶ì íëì ì§í©ìŽë€.
3. íì ì€í¬ëŠœížìì ì§í© ê°ì êŽê³
ììì íì
ì€í¬ëŠœížììì íì
ì í ë¹ ê°ë¥í ê°ë€ì ì§í©
ìŽëŒë ê²ì ìŽíŽë³Žìë€. ëí ì ëìš(union)
íì
ì ê° ì§í©ë€ì í©ì§í©ìŽëŒê³ íìë€. ìŽë¥Œ ì¢ ë ìŽíŽë³Žì.
ì€ê³ ë± ìíìì ë°°ìŽ ì§í©ì êŽê³ë¥Œ ìŒëš 뚞늿ììì ì§ììŒ íë€. ìíìì ì§í©ì ìëì ê°ìŽ ì¬ì©ëìë€.
- A: {1, 2, 3}
- B: {3, 4, 5}
- A â© B: {3}
- A ⪠B: {1, 2, 3, 4, 5}
ìíììì êµì§í©ì ê³µíµìŒë¡ ê°ì§ë ìììŽê³ í©ì§í©ì ë ì§í©ì 몚ë ìì륌 ë»íë€. íì§ë§ íì ì€í¬ëŠœížììì ì§í©ì ìŽìë ë€ë¥Žë€. íì ì€í¬ëŠœížììì íì 곌ì êŽê³ë¥Œ ìíì²ëŒ êµ³ìŽ íííìë©Ž ìëì ê°ë€.
- A: {1, 2, 3}
- B: {3, 4, 5}
- A â© B: {1, 2, 3, 4, 5}
- A ⪠B: {1, 2, 3} | {3, 4, 5}
ì§êž ëŽë íŒëì€ëœë€.
êµì§í©, í©ì§í©ì ì°šë¡ëë¡ ìŽíŽë³Žì.
3-1. íì ì€í¬ëŠœížììì êµì§í©
íì
ì€í¬ëŠœížìì êµì§í©ì ëíëŽêž° ìí êž°ížë &
ìŽê³ ìŽë ìží°ì¹ì
ìŽëŒ ë¶ëŠ°ë€.
ìì ìì륌 ìœëë¡ ìŽíŽë³Žì.
type A = {
a: number,
};
type B = {
b: number,
};
type C = A & B;
íì Cë íì Aì íì Bì êµì§í©ëë€. ê·žë ë€ë©Ž íì Cë ìŽë€ ìì±ì ê°ì§ê³ ììê¹? ë§ìœ ìíììì ì§í©ìŒë¡ ì ê·Œíë€ë©Ž íì Aì íì Bì ìì± ì€ììë ìŽë ê²ë ê²¹ì¹ë ê²ìŽ ìêž° ë묞ì ê³µì§í©ìŒë¡ ìê°í ê²ìŽë€. íì§ë§ ìŽë íë žë€.
ê²°ë¡ ë¶í° ë§íë©Ž íì Cë ìëì ê°ì ìì±ì ê°ì§ë€.
type C = {
a: number,
b: number,
};
ì륌 ë°ëŒë³Žê³ ììë©Ž,, ë§ì¹ íì
Aì íì
Bì í©ì§í©ì²ëŒ ë껎ì§ë€. ìë§ ìŽë° ìŽì ë íì
ì ìì±ì êž°ì€ìŒë¡ ìê°íêž° ëë¬žìŒ ê²ìŽë€. ìŽë²ì 볎ë êŽì ì ë€ë¥Žê² íŽ ë³Žì. A
, B
ê° íëì ì§í©ìŽë€. ìŽ ë ê°ì ì§í©ì ë§ì¡±íë ê²ì {a: number, b: number}
ìŽë€. íì
ì ìì±ìŽ ë ë§ë€ë ê²ì ë ìì ì§í©ìŽë€. ìŽê²ì íì
ì€í¬ëŠœížë¥Œ ì°ë©Žì íì ìê°íì.
3-2. íì ì€í¬ëŠœížììì í©ì§í©
ìŽë ììì ì ëìš(union)
íì
ìì ìŽíŽë³Žìë€. |
륌 ì¬ì©íì¬ í©ì§í©ì ëíëŽë©° ê·žë€ ì€ íëë§ ë§ì¡±íë©Ž ëë€. ë³Žíµ ëŠ¬í°ëŽ íì
ì ì¬ë¬ ê° ë¬¶ì ë ì¬ì©ëë€.
늬í°ëŽ íì ì ì ëìšìŒë¡ ì¬ì©íë ê²ì ìŽíŽê° ëì§ë§ 늬í°ëŽìŽ ìëëŒ ì»€ì€í¬ íì 곌 ì°ìŽë ì ëìšì ëíŽ ê¶êžìŠìŽ ì겚 ì¬ë¬ í¬ë£šë€ê³Œ ìŽìŒêž°ë¥Œ ëëìŽ ë³Žìë€. 묞ì ìí©ì ìëì ê°ë€.
type Person = {
name: string,
};
type AddressAndAge = {
age: number,
address: string,
};
type PersonWithAddreeAndAge = Person | Address;
PersonWidthAddressAndAge
íì
ì Person
íì
곌 Address
íì
ì ì ëìšìŽë€. ìŠ ë íì
ì í©ì§í©ìŽê³ ë íì
ì êµì§í©ì íŽë¹ëì§ ìëë€. ì륌 ë€ìŽ ìëì ê°ì íì
ì PersonWidthAddressAndAge
íì
ì íŽë¹ëì§ ìëë€.
const person: PersonWithAddreeAndAge = {
name: 'hd',
age: 12,
address: 'something..',
};
But...! ìì íì ììë ìë¬ê° ëì§ ìëë€. íì§ë§ íŽë¹ íì ìŒë¡ ì ìží ê°ì²Žì ì ê·Œì íë €ê³ ë³Žë ìë¬ê° ëíëë€. ìì§ íŽë¹ ìŽì ì ëíŽ íì€í ëµì ì°Ÿì§ ëª»íìë€. ì¶ìž¡ê±Žë íì ê°ë륌 ìëíì§ ììë ì¶ë€.
ìë¬ŽíŒ ì ëìšì 컀ì€í¬ íì ììë ì¬ì©íì§ ë§ê³ 늬í°ëŽ íì ì ëíŽìë§ ì¬ì©íëë¡ íì.
4. ì ëëŠ íì ììì extends
extends
í€ìëë ì ëëŠ íì
ìì íì ìë¡ ì°ìŽë©°, ~ì ë¶ë¶ ì§í©
ì ì믞íë€. ì륌 ë€ìŽ ìëì ê°ì ì ëëŠ íì
ìŽ ìë€.
function getKey<K extends string>(val: any, key: K) {}
ë ë²ì§ž ìžììž key
ì íì
ì K
íì
ìŽë€. ìŠ ì ëëŠ íì
ìŒë¡ ìŽë ììì ë ì íí ë»ì ì ì ìë€. <K extends string>
ì íµíŽ K
íì
ì string
곌 ìŽë í ì°êŽìŽ ììŽ ë³Žìžë€. ê·ž ì°êŽì ë°ë¡ K
ë stringì ë¶ë¶ ì§í©
ì ë§ì¡±íŽìŒ íë€ë ê²ìŽë€. ìŠ, K
íì
ì string 늬í°ëŽ íì
, string 늬í°ëŽ íì
ì ì ëìš, string륌 í¬íšíë€. ë묞ì ìëì ê°ìŽ íšì륌 ížì¶íë©Ž ì€ë¥ê° ëíë ê²ìŽë€.
getKey({}, 12);
5. ë°°ìŽê³Œ íí ê·žëŠ¬ê³ ížëŠ¬í
ííì ë ì«ì륌 ê°ì§ë íì ì ë§íë€. ìŽë ë°°ìŽì ë¶ë¶ ì§í©ìŒë¡ 볌 ì ìêž° ë묞ì ííì ë°°ìŽì í ë¹í ì ìë€.
type Numbers = number[];
const tuple: [number, number] = [1, 2];
const numbers: Numbers = tuple;
íì§ë§ ê·ž ë°ëë¡, ë°°ìŽì ííì ë¶ë¶ ì§í©ìŽ ìëë¯ë¡ ë°°ìŽì ííì í ë¹í ì ìë€.
type Tuple = [number, number];
const list = [1, 2]; // typeì number[]
const numbers: Tuple = list; // Type 'number[]' is not assignable to type 'Tuple'.
ížëŠ¬íì ìž ì«ì륌 ê°ì§ë íì ìŒë¡ 구조ì íìŽíì êŽì ìŒë¡ 볞ë€ë©Ž ííì í ë¹ ê°ë¥íë€ê³ ìê°ëë€. íì§ë§ ê·žë ì§ ìë€.
구조ì íìŽíìŒë¡ ìê°íë€ë©Ž ííë³Žë€ ë ë§ì ìžì륌 ê°ì§ê³ ìêž° ë묞ì ííì ë§ì¡±í ì ìë€ê³ ìê°í ì ìë€.
type Tuple = [number, number];
const triple: [number, number, number] = [1, 2, 3];
const tuple: Tuple = triple; // Type '[number, number, number]' is not assignable to type 'Tuple'.
// Source has 3 element(s) but target allows only 2.
ìì ê°ì ì€ë¥ê° ëíëë ìŽì ë íí곌 ížëŠ¬í ê°ì íì
ì length
ëŒë ê°ì ê°ì§ê³ ìêž° ë묞ì ë묞ì length
ì ê°ìŽ ìë¡ ë€ë¥Žêž° ë묞ì ì€ë¥ê° ë°ìí ê²ìŽë€.
6. íì ì€í¬ëŠœíž íì ìŽ ëì§ ëª»íë ê°ì ì§í©
íì
ì€í¬ëŠœížììë íì
ìŽ ëì§ ëª»íë ê°ì ì§í©ë€ìŽ ìë€. ì ìì ëí íì
, xì y ìì± ìžì ë€ë¥ž ìì±ìŽ ìë ê°ì²Ž
ë íì
ì€í¬ëŠœíž íì
ì ì¡Žì¬íì§ ìëë€.
ê°ë ¹ Exclude
í€ìë륌 ì¬ì©íì¬ ìŒë¶ íì
ì ì ìží ë, íì
ì€í¬ëŠœíž íì
ìŽ ëì§ ëª»íë ê°ì ì§í©ì ì ìží ì ìë ê²ìŽë€.
type NonZeroNums = Exclude<number, 0>;
NonZeroNums
íì
ì ì¬ì í number
ìŽë€.
'ð¥ íì ì€í¬ëŠœíž > Effective Typescript' 칎í ê³ ëŠ¬ì ë€ë¥ž êž
1. íì ì í ë¹ ê°ë¥í ê°ë€ì ì§í©
ìë°ì€í¬ëŠœížììë ë³ìì ë€ìí ê°ì í ë¹í ì ìë€. ìŽë¬í ê°ë€ì íì
ì€í¬ëŠœížê° ë°íì ìŽì ì ì¬êž°ì í ë¹í ì ìëê°?
ëŒë ì묞ì íê³ ì€ë¥ë¥Œ 첎í¬íêž° ììíë€.
ì€ë¥ë¥Œ íµíŽ íì ì€í¬ëŠœížììì ì§í©ìŽëŒë ê°ë ì ë€ê°ê°ë³Žì.
1-1. íì ì€ë¥1
íì ì€í¬ëŠœížê° ë§ìœ ì€ë¥ë¥Œ ë°ê²¬íë©Ž ìëì ê°ì ì€ë¥ë¥Œ ë°ê²¬í ì ìë€.

Type 'number' is not assignable to type 'string'.
ì«ì íì
ì 묞ììŽì íì
ì í ë¹ì í ì ìë€ë ê²ìŽë€. ìŽ ë¬žêµ¬ë ì§í©ì êŽì ìì ìëì²ëŒ íŽìí ì ìë€.
- ì«ì íì
ì 묞ììŽ íì
ì
ë¶ë¶ ì§í©
ìŽ ìëë€.(ë íì ì êŽê³)
1-2. íì ì€ë¥2
ë ë€ë¥ž ì€ë¥ë¥Œ 볎며 ì§í©ìŽëŒë ê°ë ì ì ëŠœíŽ ë³Žì.

AB
ì íì
ì "A" ëë "B"ìŽë€. íì§ë§ ê·ž ìŽ ìžì ê°ì í ë¹íêž° ë묞ì ìì ê°ì ì€ë¥ê° ëíëë€. ìŽ ë¬žêµ¬ë ì§í©ì êŽì ìì íŽìíŽ ë³Žë©Ž ìëì ê°ë€.
- "C"íì ì "AB" íì ì ììê° ìëëë€.(ê°ê³Œ íì ì êŽê³)
1-3. ê·žëì ì§í©ìŽë?
type Person = {
name: string,
age: number,
};
Person
ì ìì±ìž name, ageê° ì§í©ìŽ ìëëŒ, Person
ê·ž ìì²Žê° ì§í©ìŽë€.
2. íì ì€í¬ëŠœížììì íì (ì§í©)ì ì¢ ë¥
2-1. never íì
never
íì
ì íì
ì€í¬ëŠœížìì ê°ì¥ ìì ì§í©ìŽë€. never
íì
ìŒë¡ ì ìžë ë³ìì ë²ìë ê³µì§í©ìŽêž° ë묞ì ìë¬Žë° ê°ë í ë¹í ì ìë€.
2-2. ì ë(unit) íì
never
íì
ë€ììŒë¡ ìì ì§í©ì í ê°ì§ ê°ë§ í¬íšíë íì
ìŽë€. ìŽë¥Œ ì ë(unit) ëë 늬í°ëŽ(literal)
íì
ìŽëŒê³ íë€.
type A = 'A';
type B = 'B';
type Twelve = 12;
2-3. ì ëìš(union) íì
ì ë(unit)
íì
ì ì¬ë¬ ê° ë¬¶ìŒë©Ž ì ëìš(union)
íì
ìŽ ëë€. ì ëìš íì
ì ê° ì§í©ë€ì í©ì§í©ì ë»íë€.
type AB = 'A' | 'B';
type Animals = 'Cat' | 'Dog' | 'Bird';
2-4. ê·ž ìžì íì ë€
íí ì°ìŽë number
, string
, boolean
ë±... ìŽë€ë íëì ì§í©ìŽë€. ìŠ, ëìŒí í¹ì§ì 묶ì íëì ì§í©ìŽë€.
3. íì ì€í¬ëŠœížìì ì§í© ê°ì êŽê³
ììì íì
ì€í¬ëŠœížììì íì
ì í ë¹ ê°ë¥í ê°ë€ì ì§í©
ìŽëŒë ê²ì ìŽíŽë³Žìë€. ëí ì ëìš(union)
íì
ì ê° ì§í©ë€ì í©ì§í©ìŽëŒê³ íìë€. ìŽë¥Œ ì¢ ë ìŽíŽë³Žì.
ì€ê³ ë± ìíìì ë°°ìŽ ì§í©ì êŽê³ë¥Œ ìŒëš 뚞늿ììì ì§ììŒ íë€. ìíìì ì§í©ì ìëì ê°ìŽ ì¬ì©ëìë€.
- A: {1, 2, 3}
- B: {3, 4, 5}
- A â© B: {3}
- A ⪠B: {1, 2, 3, 4, 5}
ìíììì êµì§í©ì ê³µíµìŒë¡ ê°ì§ë ìììŽê³ í©ì§í©ì ë ì§í©ì 몚ë ìì륌 ë»íë€. íì§ë§ íì ì€í¬ëŠœížììì ì§í©ì ìŽìë ë€ë¥Žë€. íì ì€í¬ëŠœížììì íì 곌ì êŽê³ë¥Œ ìíì²ëŒ êµ³ìŽ íííìë©Ž ìëì ê°ë€.
- A: {1, 2, 3}
- B: {3, 4, 5}
- A â© B: {1, 2, 3, 4, 5}
- A ⪠B: {1, 2, 3} | {3, 4, 5}
ì§êž ëŽë íŒëì€ëœë€.
êµì§í©, í©ì§í©ì ì°šë¡ëë¡ ìŽíŽë³Žì.
3-1. íì ì€í¬ëŠœížììì êµì§í©
íì
ì€í¬ëŠœížìì êµì§í©ì ëíëŽêž° ìí êž°ížë &
ìŽê³ ìŽë ìží°ì¹ì
ìŽëŒ ë¶ëŠ°ë€.
ìì ìì륌 ìœëë¡ ìŽíŽë³Žì.
type A = {
a: number,
};
type B = {
b: number,
};
type C = A & B;
íì Cë íì Aì íì Bì êµì§í©ëë€. ê·žë ë€ë©Ž íì Cë ìŽë€ ìì±ì ê°ì§ê³ ììê¹? ë§ìœ ìíììì ì§í©ìŒë¡ ì ê·Œíë€ë©Ž íì Aì íì Bì ìì± ì€ììë ìŽë ê²ë ê²¹ì¹ë ê²ìŽ ìêž° ë묞ì ê³µì§í©ìŒë¡ ìê°í ê²ìŽë€. íì§ë§ ìŽë íë žë€.
ê²°ë¡ ë¶í° ë§íë©Ž íì Cë ìëì ê°ì ìì±ì ê°ì§ë€.
type C = {
a: number,
b: number,
};
ì륌 ë°ëŒë³Žê³ ììë©Ž,, ë§ì¹ íì
Aì íì
Bì í©ì§í©ì²ëŒ ë껎ì§ë€. ìë§ ìŽë° ìŽì ë íì
ì ìì±ì êž°ì€ìŒë¡ ìê°íêž° ëë¬žìŒ ê²ìŽë€. ìŽë²ì 볎ë êŽì ì ë€ë¥Žê² íŽ ë³Žì. A
, B
ê° íëì ì§í©ìŽë€. ìŽ ë ê°ì ì§í©ì ë§ì¡±íë ê²ì {a: number, b: number}
ìŽë€. íì
ì ìì±ìŽ ë ë§ë€ë ê²ì ë ìì ì§í©ìŽë€. ìŽê²ì íì
ì€í¬ëŠœížë¥Œ ì°ë©Žì íì ìê°íì.
3-2. íì ì€í¬ëŠœížììì í©ì§í©
ìŽë ììì ì ëìš(union)
íì
ìì ìŽíŽë³Žìë€. |
륌 ì¬ì©íì¬ í©ì§í©ì ëíëŽë©° ê·žë€ ì€ íëë§ ë§ì¡±íë©Ž ëë€. ë³Žíµ ëŠ¬í°ëŽ íì
ì ì¬ë¬ ê° ë¬¶ì ë ì¬ì©ëë€.
늬í°ëŽ íì ì ì ëìšìŒë¡ ì¬ì©íë ê²ì ìŽíŽê° ëì§ë§ 늬í°ëŽìŽ ìëëŒ ì»€ì€í¬ íì 곌 ì°ìŽë ì ëìšì ëíŽ ê¶êžìŠìŽ ì겚 ì¬ë¬ í¬ë£šë€ê³Œ ìŽìŒêž°ë¥Œ ëëìŽ ë³Žìë€. 묞ì ìí©ì ìëì ê°ë€.
type Person = {
name: string,
};
type AddressAndAge = {
age: number,
address: string,
};
type PersonWithAddreeAndAge = Person | Address;
PersonWidthAddressAndAge
íì
ì Person
íì
곌 Address
íì
ì ì ëìšìŽë€. ìŠ ë íì
ì í©ì§í©ìŽê³ ë íì
ì êµì§í©ì íŽë¹ëì§ ìëë€. ì륌 ë€ìŽ ìëì ê°ì íì
ì PersonWidthAddressAndAge
íì
ì íŽë¹ëì§ ìëë€.
const person: PersonWithAddreeAndAge = {
name: 'hd',
age: 12,
address: 'something..',
};
But...! ìì íì ììë ìë¬ê° ëì§ ìëë€. íì§ë§ íŽë¹ íì ìŒë¡ ì ìží ê°ì²Žì ì ê·Œì íë €ê³ ë³Žë ìë¬ê° ëíëë€. ìì§ íŽë¹ ìŽì ì ëíŽ íì€í ëµì ì°Ÿì§ ëª»íìë€. ì¶ìž¡ê±Žë íì ê°ë륌 ìëíì§ ììë ì¶ë€.
ìë¬ŽíŒ ì ëìšì 컀ì€í¬ íì ììë ì¬ì©íì§ ë§ê³ 늬í°ëŽ íì ì ëíŽìë§ ì¬ì©íëë¡ íì.
4. ì ëëŠ íì ììì extends
extends
í€ìëë ì ëëŠ íì
ìì íì ìë¡ ì°ìŽë©°, ~ì ë¶ë¶ ì§í©
ì ì믞íë€. ì륌 ë€ìŽ ìëì ê°ì ì ëëŠ íì
ìŽ ìë€.
function getKey<K extends string>(val: any, key: K) {}
ë ë²ì§ž ìžììž key
ì íì
ì K
íì
ìŽë€. ìŠ ì ëëŠ íì
ìŒë¡ ìŽë ììì ë ì íí ë»ì ì ì ìë€. <K extends string>
ì íµíŽ K
íì
ì string
곌 ìŽë í ì°êŽìŽ ììŽ ë³Žìžë€. ê·ž ì°êŽì ë°ë¡ K
ë stringì ë¶ë¶ ì§í©
ì ë§ì¡±íŽìŒ íë€ë ê²ìŽë€. ìŠ, K
íì
ì string 늬í°ëŽ íì
, string 늬í°ëŽ íì
ì ì ëìš, string륌 í¬íšíë€. ë묞ì ìëì ê°ìŽ íšì륌 ížì¶íë©Ž ì€ë¥ê° ëíë ê²ìŽë€.
getKey({}, 12);
5. ë°°ìŽê³Œ íí ê·žëŠ¬ê³ ížëŠ¬í
ííì ë ì«ì륌 ê°ì§ë íì ì ë§íë€. ìŽë ë°°ìŽì ë¶ë¶ ì§í©ìŒë¡ 볌 ì ìêž° ë묞ì ííì ë°°ìŽì í ë¹í ì ìë€.
type Numbers = number[];
const tuple: [number, number] = [1, 2];
const numbers: Numbers = tuple;
íì§ë§ ê·ž ë°ëë¡, ë°°ìŽì ííì ë¶ë¶ ì§í©ìŽ ìëë¯ë¡ ë°°ìŽì ííì í ë¹í ì ìë€.
type Tuple = [number, number];
const list = [1, 2]; // typeì number[]
const numbers: Tuple = list; // Type 'number[]' is not assignable to type 'Tuple'.
ížëŠ¬íì ìž ì«ì륌 ê°ì§ë íì ìŒë¡ 구조ì íìŽíì êŽì ìŒë¡ 볞ë€ë©Ž ííì í ë¹ ê°ë¥íë€ê³ ìê°ëë€. íì§ë§ ê·žë ì§ ìë€.
구조ì íìŽíìŒë¡ ìê°íë€ë©Ž ííë³Žë€ ë ë§ì ìžì륌 ê°ì§ê³ ìêž° ë묞ì ííì ë§ì¡±í ì ìë€ê³ ìê°í ì ìë€.
type Tuple = [number, number];
const triple: [number, number, number] = [1, 2, 3];
const tuple: Tuple = triple; // Type '[number, number, number]' is not assignable to type 'Tuple'.
// Source has 3 element(s) but target allows only 2.
ìì ê°ì ì€ë¥ê° ëíëë ìŽì ë íí곌 ížëŠ¬í ê°ì íì
ì length
ëŒë ê°ì ê°ì§ê³ ìêž° ë묞ì ë묞ì length
ì ê°ìŽ ìë¡ ë€ë¥Žêž° ë묞ì ì€ë¥ê° ë°ìí ê²ìŽë€.
6. íì ì€í¬ëŠœíž íì ìŽ ëì§ ëª»íë ê°ì ì§í©
íì
ì€í¬ëŠœížììë íì
ìŽ ëì§ ëª»íë ê°ì ì§í©ë€ìŽ ìë€. ì ìì ëí íì
, xì y ìì± ìžì ë€ë¥ž ìì±ìŽ ìë ê°ì²Ž
ë íì
ì€í¬ëŠœíž íì
ì ì¡Žì¬íì§ ìëë€.
ê°ë ¹ Exclude
í€ìë륌 ì¬ì©íì¬ ìŒë¶ íì
ì ì ìží ë, íì
ì€í¬ëŠœíž íì
ìŽ ëì§ ëª»íë ê°ì ì§í©ì ì ìží ì ìë ê²ìŽë€.
type NonZeroNums = Exclude<number, 0>;
NonZeroNums
íì
ì ì¬ì í number
ìŽë€.