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
μ΄λ€.