π€ Chapter 10: μ λ€λ¦ νμ μ΄ν΄νκΈ°
π¦ μ λ€λ¦ νμ μ΄ν΄νκΈ°β
- μ λ€λ¦ νμ μ μΈν°νμ΄μ€λ ν΄λμ€, ν¨μ, νμ λ³μΉ λ±μ μ¬μ©ν μ μλ κΈ°λ₯μΌλ‘, ν΄λΉ μ¬λ²μ νμ μ 미리 μ§μ νμ§ μκ³ λ€μν νμ μ λμνλ €κ³ ν λ μ¬μ©νλ€.
// μ λ€λ¦ μΈν°νμ΄μ€ ꡬ문
interface IValuable<T> {
value: T;
}
// μ λ€λ¦ ν¨μ ꡬλΆ
function identity<T>(arg: T): T { return arg; }
// μ λ€λ¦ νμ
λ³μΉ ꡬ문
type IValuable<T> = {
value: T;
}
// μ λ€λ¦ ν΄λμ€ κ΅¬λ¬Έ
class Valuable<T> {
constructor(public value: T) {};
}
π μ λ€λ¦ μ¬μ©νκΈ°β
- μ λ€λ¦ μΈν°νμ΄μ€
IValuable<T>
λ₯Ό ꡬννλ μ λ€λ¦ ν΄λμ€λ μμ μ΄ κ°μ§ νμ λ³μT
λ₯Ό λ€μμ²λΌ μΈν°νμ΄μ€ μͺ½ μ λ€λ¦ νμ λ³μλ‘ λκΈΈ μ μλ€.
interface IValuable<T> {
value: T;
}
class Valuable<T> implements IValuable<T> {
constructor(public value: T) {}
}
// μ λ€λ¦ ν¨μλ λ€μμ²λΌ μμ μ νμ
λ³μ Tλ₯Ό μ λ€λ¦ μΈν°νμ΄μ€μ νμ
λ³μ μͺ½μΌλ‘ λκΈ°λ ννλ‘ κ΅¬νν μ μλ€.
const printValue = <T>(o: IValuable<T>): void => console.log(o.value);
printValue(new Valuable<number>(1)); // 1
printValue(new Valuable<boolean>(true)); // true
printValue(new Valuable<string>('hello')); // hello
printValue(new Valuable<number[]>([1, 2, 3])); // [1, 2, 3]
π¦ μ λ€λ¦ νμ μ μ½β
- μ λ€λ¦ νμ μ μ½μ νμ λ³μμ μ μ©ν μ μλ νμ μ λ²μλ₯Ό νμ νλ κΈ°λ₯μ νλ€.
- νμ μ€ν¬λ¦½νΈμμ μ λ€λ¦ ν¨μμ νμ μ μ ννκ³ μΆμ λλ λ€μ ꡬ문μ μ¬μ©νλ€.
<μ΅μ’
νμ
1 extend νμ
1, μ΅μ’
νμ
2 extend νμ
2>(a: μ΅μ’
νμ
1, b: μ΅μ’
νμ
2, ...) {}
printValueT
ν¨μλ μ λ€λ¦ νμ μ μ½ κ΅¬λ¬Έμ μ¬μ©ν΄ ꡬννκ³ μλ€.
const printValueT = <Q, T extends IValuable<Q>>(o: T) => console.log(o.value);
printValueT(new Valuable(1)); // 1
printValueT({ value: true }); //true