π€ Chapter 5. any λ€λ£¨κΈ°
π₯ μμ΄ν
38. any
νμ
μ κ°λ₯ν ν μ’μ λ²μμμλ§ μ¬μ©νκΈ°β
function processBar(b: Bar) { /* ... */ }
function f() {
const x = expressionReturnFoo();
processBar(x);
// ~ 'Foo' νμμ μΈμλ 'Bar' νμμ 맀κ°λ³μμ ν λΉλ μ μμ΅λλ€.
}
λ¬Έλ§₯μμΌλ‘ x
λΌλ λ³μκ° λμμ Foo
νμ
κ³Ό Bar
νμ
μ ν λΉ κ°λ₯νλ€λ©΄, μ€λ₯λ₯Ό μ κ±°νλ λ°©λ²μ λ κ°μ§μ
λλ€.
function f1() {
const x: any = expressionReturnFoo(); // μ΄λ κ² νμ§ λ§μλ€.
processBar(x);
}
function f2() {
const x = expressionReturnFoo();
processBar(x as any); // μ΄κ² λ«μ΅λλ€.
}
λ κ°μ§ ν΄κ²°μ±
μ€μμ f1
μ μ¬μ©λ x: any
λ³΄λ€ f2
μ μ¬μ©λ x as any
ννκ° κΆμ₯λ©λλ€. κ·Έ μ΄μ λ any
νμ
μ΄ processBar
ν¨μμ 맀κ°λ³μμμλ§ μ¬μ©λ ννμμ΄λ―λ‘ λ€λ₯Έ μ½λμλ μν₯μ λ―ΈμΉμ§ μκΈ° λλ¬Έμ
λλ€.
λΉμ·ν κ΄μ μμ, νμ
μ€ν¬λ¦½νΈκ° ν¨μμ λ°ν νμ
μ μΆλ‘ ν μ μλ κ²½μ°μλ ν¨μμ λ°ν νμ
μ λͺ
μνλ κ²μ΄ μ’μ΅λλ€. ν¨μμ λ°ν νμ
μ λͺ
μνλ©΄ any
νμ
μ ν¨μ λ°κΉ₯μΌλ‘ μν₯μ λ―ΈμΉλ κ²μ λ°©μ§ν μ μμ΅λλ€.
f1
μ μ€λ₯λ₯Ό μ κ±°νκΈ° μν΄ x
λ₯Ό any
νμ
μΌλ‘ μ μΈνμ΅λλ€. ννΈ f2
λ μ€λ₯λ₯Ό μ κ±°νκΈ° μν΄ x
κ° μ¬μ©λλ κ³³μ as any
λ¨μΈλ¬Έμ μ¬μ©νμ΅λλ€. μ¬κΈ°μ @ts-ignore
λ₯Ό μ¬μ©νλ©΄ any
λ₯Ό μ¬μ©νμ§ μκ³ μ€λ₯λ₯Ό μ κ±°ν μ μμ΅λλ€.
function f1() {
const x = expressionReturnFoo();
// @ts-ignore
processBar(x);
return x;
}
κ·Έλ¬λ κ·Όλ³Έμ μΈ μμΈμ ν΄κ²°ν κ²μ΄ μλκΈ° λλ¬Έμ λ€λ₯Έ κ³³μμ λ ν° λ¬Έμ κ° λ°μν μλ μμ΅λλ€. νμ
μ²΄μ»€κ° μλ € μ£Όλ μ€λ₯λ λ¬Έμ κ° λ κ°λ₯μ±μ΄ λμ λΆλΆμ΄λ―λ‘ κ·Όλ³Έμ μΈ μμΈμ μ°Ύμ μ κ·Ήμ μΌλ‘ λμ²νλ κ²μ΄ λ°λμ§ν©λλ€.
μ΄λ²μλ κ°μ²΄μ κ΄λ ¨ν any
μ μ¬μ©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. μ΄λ€ ν° κ°μ²΄ μμ ν κ° μμ±μ΄ νμ
μ€λ₯λ₯Ό κ°μ§λ μν©μ μλ‘ λ€μ΄ λ³΄κ² μ΅λλ€.
const config: Config = {
a: 1,
b: 2,
c: {
key: value
// ~~ 'foo' μμ±μ΄ 'Foo' νμ
μ νμνμ§λ§ 'Bar' νμ
μλ μμ΅λλ€.
}
};
λ¨μν μκ°νλ©΄ config
κ°μ²΄ μ 체λ₯Ό as any
λ‘ μ μΈν΄μ μ€λ₯λ₯Ό μ κ±°ν μ μμ΅λλ€.
const config: Config = {
a: 1,
b: 2,
c: {
key: value
}
} as any; // μ΄λ κ² νμ§ λ§μλ€!
κ°μ²΄ μ 체λ₯Ό any
λ‘ λ¨μΈνλ©΄ λ€λ₯Έ μμ±λ€ μμ νμ
체ν¬κ° λμ§ μλ λΆμμ©μ΄ μκΉλλ€. κ·Έλ¬λ―λ‘ λ€μ μ½λμ²λΌ μ΅μνμ λ²μμμλ§ any
λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
const config: Config = {
a: 1,
b: 2,
c: {
key: value as any
}
};
π₯ μμ΄ν
39. any
λ₯Ό ꡬ체μ μΌλ‘ λ³νν΄μ μ¬μ©νκΈ°β
any
λ μλ°μ€ν¬λ¦½νΈμμ ννν μ μλ λͺ¨λ κ°μ μμ°λ₯΄λ λ§€μ° ν° λ²μμ νμ
μ
λλ€. any
νμ
μλ λͺ¨λ μ«μ, λ¬Έμμ΄, λ°°μ΄, κ°μ²΄, μ κ·μ, ν¨μ, ν΄λμ€, DOM μ리먼νΈλ λ¬Όλ‘ null
κ³Ό undefined
κΉμ§λ ν¬ν¨λ©λλ€.
λ°λλ‘ λ§νλ©΄, μΌλ°μ μΈ μν©μμλ any
λ³΄λ€ λ ꡬ체μ μΌλ‘ ννν μ μλ νμ
μ΄ μ‘΄μ¬ν κ°λ₯μ±μ΄ λκΈ° λλ¬Έμ λ ꡬ체μ μΈ νμ
μ μ°Ύμ νμ
μμ μ±μ λμ΄λλ‘ ν΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄, any
νμ
μ κ°μ κ·Έλλ‘ μ κ·μμ΄λ ν¨μμ λ£λ κ²μ κΆμ₯λμ§ μμ΅λλ€.
function getLengthBad(array: any) { // μ΄λ κ² νμ§ λ§μλ€!
return array.length;
}
function getLength(array: any[]) {
return array:length;
}
μμ μμ μμ any
λ₯Ό μ¬μ©νλ getLengthBad
보λ€λ any[]
λ₯Ό μ¬μ©νλ getLength
κ° λ μ’μ ν¨μμ
λλ€. κ·Έ μ΄μ λ μΈ κ°μ§μ
λλ€.
- ν¨μ λ΄μ
array.length
νμ μ΄ μ²΄ν¬λ©λλ€. - ν¨μμ λ°ν νμ
μ΄
any
λμnumber
λ‘ μΆλ‘ λ©λλ€. - ν¨μ νΈμΆλ λ 맀κ°λ³μκ° λ°°μ΄μΈμ§ 체ν¬ν©λλ€.
κ·Έλ¦¬κ³ ν¨μμ 맀κ°λ³μκ° κ°μ²΄μ΄κΈ΄ νμ§λ§ κ°μ μ μ μλ€λ©΄ {[key: string]: any}
μ²λΌ μ μΈνλ©΄ λ©λλ€.
function hasTwelveLetterKey(o: {[key: string]: any}) {
for (const key in o) {
if (key.length === 12) {
return true;
}
}
return false;
}
μμ μμ μ²λΌ ν¨μμ 맀κ°λ³μκ° κ°μ²΄μ§λ§ κ°μ μ μ μλ€λ©΄ λͺ¨λ λΉκΈ°λ³Έν νμ
μ ν¬ν¨νλ object
νμ
μ μ¬μ©ν μλ μμ΅λλ€. object
νμ
μ κ°μ²΄μ ν€λ₯Ό μ΄κ±°ν μλ μμ§λ§ μμ±μ μ κ·Όν μ μλ€λ μ μμ {[key: string]: any}
μ μ½κ° λ€λ¦
λλ€.
ν¨μμ νμ
μμλ λ¨μν any
λ₯Ό μ¬μ©ν΄μλ μ λ©λλ€. μ΅μνμΌλ‘λλ§ κ΅¬μ²΄νν μ μλ μΈ κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
type Fn0 = () => any; // 맀κ°λ³μ μμ΄ νΈμΆ κ°λ₯ν λͺ¨λ ν¨μ
type Fn1 = (arg: any) => any; // 맀κ°λ³μ 1κ°
type FnN = (...args: any[]) => any; // λͺ¨λ κ°μμ 맀κ°λ³μ "Function" νμ
κ³Ό λμΌν©λλ€.
μμ μμ μ λ±μ₯ν μΈ κ°μ§ ν¨μ νμ
λͺ¨λ any
보λ€λ ꡬ체μ μ
λλ€. λ§μ§λ§ μ€μ μ μ΄ν΄λ³΄λ©΄ ...args
μ νμ
μ any[]
λ‘ μ μΈνμ΅λλ€. any
λ‘ μ μΈν΄λ λμνμ§λ§ any[]
λ‘ μ μΈνλ©΄ λ°°μ΄ ννγ
λΌλ κ²μ μ μ μμ΄ λ ꡬ체μ μ
λλ€.
const numArgsBad = (...args: any) => args.length; // anyλ₯Ό λ°νν©λλ€.
const numArgsGood = (...args: any[]) => args.length; // numberλ₯Ό λ°νν©λλ€.