μ€λ²λ‘λ© νμ μ΄λ?
μ€λ²λ‘λ© νμ μ μμ΄ν 3μμ λ€λ£¨μλ κ°λ μ΄λ€. λ€μ μ 리νμλ©΄ λ€μκ³Ό κ°λ€.
μ°μ ν¨μ μ€λ²λ‘λ©μ΄λ λμΌν μ΄λ¦μ 맀κ°λ³μλ§ λ€λ₯Έ μ¬λ¬ λ²μ μ ν¨μλ₯Ό νμ©νλ κ²μ΄λ€. νμ§λ§ νμ μ€ν¬λ¦½νΈμμλ λΆκ°λ₯νλ€. νμ μ€ν¬λ¦½νΈμ λΉμ·ν κΈ°λ₯μ μ§μνμ§λ§ μ΄λ νμ μμ€μμλ§ λμνλ―λ‘ μ€λ²λ‘λ© νμ μ΄λΌκ³ νλ€. μ¦, νλμ ν¨μμ λν΄ μ¬λ¬ κ°μ μ μΈλ¬Έμ μμ±ν μ μμ§λ§, ꡬν체λ μ€μ§ νλλΏμ΄λ€.
function add(a: number, b: number): number; // add ν¨μμ λν μ μΈλ¬Έ 1
function add(a: string, b: string): string; // add ν¨μμ λν μ μΈλ¬Έ 2
// add ν¨μ ꡬν체
function add(a, b) {
return a + b;
}
const ab = add(12, 4);
const bc = add('3', '1');
μ€λ²λ‘λ© νμ μΌλ‘ ν¨μμ νμ μ 보λ₯Ό μΆκ°νκΈ°
μ€λ²λ‘λ© νμ μ μ¬μ©νμ¬ ν¨μμ νμ μ 보λ₯Ό μΆκ°νλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ΅λλ€. λͺ κ°μ§λ₯Ό μ΄ν΄λ³΄λ©° ν΄λΉ νμ μ΄ κ°μ§λ λ¨μ μ λν΄ μ΄ν΄λ³Έλ€.
1οΈβ£ μ λμ¨ νμ μΌλ‘ μΆκ°νκΈ°
function double(x: number | string): number | string; // double ν¨μμ λν μ μΈλ¬Έ
// double ν¨μ ꡬν체
function double(x: any) {
return x + x;
}
const num = double(4); // νμ
μ΄ string | number
const str = double('3'); // νμ
μ΄ string | number
double ν¨μμ 맀κ°λ³μ xμλ numberμ string νμ μ΄ μ¬ μ μμ΅λλ€. μ΄λ€ νμ μ 맀κ°λ³μλ₯Ό λ°λλμ λ°λΌ λ°νλλ κ°μ νμ λ μ ν΄μ§λ€.
μ¦, number νμ μ 맀κ°λ³μλ₯Ό λ°λλ€λ©΄ number νμ μ κ°μ λ°ννκ³ string νμ μ 맀κ°λ³μλ₯Ό λ°λλ€λ©΄ string νμ μ κ°μ λ°ννλ€. νμ§λ§ 맀κ°λ³μμ νμ μ΄ μ΄λ€ κ²μ΄λ μκ΄μμ΄ λ°νκ°μ νμ μ΄ string | number μΈ κ²μ νμΈν μ μλ€.
2οΈβ£ μ λ€λ¦μ μ¬μ©νκΈ°
μμμ μμ±ν double ν¨μμ λν μ μΈλ¬Έμ μ λ€λ¦μΌλ‘ λ°κΎΈλ©΄ νμ μ λ³΄λ€ κ΅¬μ²΄μ μΌλ‘ λ§λ€ μ μλ€.
function double<T extends number | string>(x: T): T; // double ν¨μμ λν μ μΈλ¬Έ
// double ν¨μ ꡬν체
function double(x) {
return x + x;
}
const num = double(4); // νμ
μ΄ 4
const str = double('3'); // νμ
μ΄ "3"
νμ§λ§ λ°ν νμ μ΄ λ무 ꡬ체μ μΌλ‘ λ°λμλ€. μ¦, Tλ₯Ό λ°μ Tλ₯Ό λ°ννλ νμ μ΄λ―λ‘ λ§€κ°λ³μλ‘ λ°λ κ°μ΄ 맀κ°λ³μμ νμ μ΄ λλ©΄μ λμμ λ°νλλ κ°μ νμ λ λλ€. κ²°κ΅ numκ³Ό strμ κ°κ° 8, "33" μ΄μ§λ§ νμ κ³Ό λ§μ§ μμ΅λλ€. μ΄λ λ¬Έμ κ° μλ€.
λ°νλλ κ°μ νμ μ string λλ numberμ΄κ³ μΆλ€.
3οΈβ£ μ¬λ¬ κ°μ§ νμ μ μΈμΌλ‘ λΆλ¦¬νκΈ°
μλ§, μ€λ²λ‘λ© νμ μ μ¬μ©μ νλ€λ©΄ ν΄λΉ λ°©λ²μ κ°μ₯ λ§μ΄ μ¬μ©νμ§ μμκΉ μΆλ€.
function double(x: number): number; // double ν¨μμ λν μ μΈλ¬Έ 1
function double(x: string): string; // double ν¨μμ λν μ μΈλ¬Έ 2
// double ν¨μ ꡬν체
function double(x: any) {
return x + x;
}
const num = double(4); // νμ
μ΄ number
const str = double('3'); // νμ
μ΄ string
μμ κ°μ΄ μν©μ λ°λ₯Έ μ¬λ¬ κ°μ§ νμ μ μ μΈνμ¬ double ν¨μμ νμ μ κ°μ ν μ μμ΅λλ€. νμ§λ§ μ λμ¨ νμ κ΄λ ¨ν΄μλ μ¬μ ν λ¬Έμ κ° λ°μν©λλ€. λ€μκ³Ό κ°μ ν¨μκ° μλ€.
function somethingFn(x: number | string) {
return double(x);
}
somethingFn λ΄λΆμμ double ν¨μλ₯Ό νΈμΆνκ³ μμ΅λλ€. μ΄λ 맀κ°λ³μ xμ νμ μ number | string μ λλ€. νμ§λ§ μμμ μ μΈν double ν¨μμ λν μ μΈλ¬Έμμ xμ 맀κ°λ³μμ νμ μ number, string λΏμ λλ€. λλ¬Έμ λ€μκ³Ό κ°μ μ€λ₯κ° λνλλ€.
μμ κ°μ λ¬Έμ λ₯Ό ν΄κ²°ν΄ λ΄ μλ€.
4οΈβ£ μΈ λ²μ§Έ μ€λ²λ‘λ© νμ μ μΆκ°νκΈ°
μλμ κ°μ μ€λ²λ‘λ© νμ μ μΆκ°νλ©΄ κ°λ¨νκ² μ€λ₯λ₯Ό ν΄κ²°ν μ μλ€.
function double(x: number | string): number | string; // double ν¨μμ λν μ μΈλ¬Έ 3
5οΈβ£ μ‘°κ±΄λΆ νμ (conditional type) μ¬μ©νκΈ°
μΈ λ²μ§Έ μ€λ²λ‘λ© νμ μ μΆκ°νμ¬ 3λ²μ μ€λ₯λ₯Ό ν΄κ²°ν μ μμ§λ§ κ°μ₯ μ’μ ν΄κ²°μ± μ μ‘°κ±΄λΆ νμ μ μ¬μ©νλ κ²μ΄λ€. μ‘°κ±΄λΆ νμ μ νμ 곡κ°μ if ꡬ문과 κ°μΌλ©° μλ°μ€ν¬λ¦½νΈμ μΌν μ°μ°μ(?:)μ²λΌ μ¬μ©νλ©΄ λλ€.
// double ν¨μμ λν μ μΈλ¬Έ
function double<T extends number | string>(
x: T
): T extends number ? number : string;
// double ν¨μ ꡬν체
function double(x: any) {
return x + x;
}
const num = double(4); // νμ
μ΄ number
const str = double('3'); // νμ
μ΄ string
function somethingFn(x: number | string) {
return double(x);
}
Tκ° number | string μ΄λΌλ©΄ νμ μ€ν¬λ¦½νΈλ μ‘°κ±΄λΆ νμ μ λ€μ λ¨κ³λ‘ ν΄μνλ€.
1. (number | string) extends number ? number : string
2. number extends number ? number : string | string extends number ? number : string
3. number | string
μ΄λ¬ν μ‘°κ±΄λΆ νμ μ λ€μκ³Ό κ°μ μ₯μ μ΄ μλ€.
1. κ°λ³ νμ κ³Ό μ λμ¨μΌλ‘ μΌλ°ννκΈ° λλ¬Έμ νμ μ΄ λ μ νν΄μ§λ€.
2. νμ μ²΄μ»€κ° λ¨μΌ ννμμΌλ‘ λ°μλ€μ΄κΈ° λλ¬Έμ μ λμ¨ λ¬Έμ (3λ²μμ λ΄€λ λ¬Έμ )λ₯Ό ν΄κ²°ν μ μλ€.
μμ½
1. μ€λ²λ‘λ© νμ μ μμ± μ€μ΄λΌλ©΄ μ‘°κ±΄λΆ νμ μ μ¬μ©ν΄μ κ°μ ν μ μμμ§ κ²ν νκΈ°
2. μ€λ²λ‘λ© νμ λ³΄λ€ μ‘°κ±΄λΆ νμ μ μ¬μ©νλ κ²μ΄ μ’μ
3. μ‘°κ±΄λΆ νμ μ μΆκ°μ μΈ μ€λ²λ‘λ© μμ΄ μ λμ¨ νμ μ μ§μ