Unknown Type
unknown VS any
unknown typeμ typescript 3.0 λ²μ μμ μλ‘ μκ°λ νμ
μ΄λ€. any νμ
μ²λΌ unknown νμ
μλ μ΄λ€ νμ
μ κ°λ ν λΉν μ μλ€. μ΄λ λμ 곡ν΅μ μ΄λ€. λ€λ₯Έ μ μ, any νμ
μ κ°μ μ΄λ νμ
μ λ³μμλ ν λΉλ μ μμΌλ, unknown νμ
μ κ°μ anyμ unknown νμ
μ μ μΈν νμ
μ λ³μμλ ν λΉμ΄ λΆκ°λ₯νλ€.
μ‘°κΈ λ μ½κ² μ½λλ‘ μλ₯Ό λ€μ΄λ³΄μ.
let notSure: unknown;
notSure = 1;
notSure = "maybe a string instead";
// any typeμλ unknown νμ
ν λΉ κ°λ₯
let anyType: any;
anyType = notSure;
// any, unknown μ΄μΈμ typeμλ unknown νμ
ν λΉ λΆκ°λ₯
let numberType: number;
numberType = notSure; // compile error!
TypeScript
볡μ¬
unknown νμ
λ³μμλ number, string λ± μ΄λ€ νμ
μ κ°λ ν λΉλ μ μλ€. κ·Έλ¬λ number typeμ λ³μ numberType μ unknown νμ
μ κ°μ ν λΉνλ €κ³ νλ©΄ Type 'unknown' is not assignable to type 'number' λΌλ μ»΄νμΌ μλ¬κ° λλ€. μμμ μΈκΈν κ²μ²λΌ unknown νμ
μ κ°μ any, unknown μΈμ νμ
μ λ³μμ ν λΉνλ €κ³ νλ©΄ μλ¬κ° λλ€.
λ±μ₯ λ°°κ²½
any νμ
μ νμ
체νΉλ μνκ³ μ΄λ€ νμ
μλ ν λΉλ μ μλ κ΄λν νμ
μ΄λ€. any νμ
μ νλ‘κ·Έλλ°μ ν λλ νΈνμ§λ§, μλ μ½λμ²λΌ λ²κ·Έλ₯Ό μΌκΈ°ν μ μλ μνμ΄ μκΈ°λ νλ€.
any νμ
μ foo λ³μμλ 10μ΄ ν λΉλμλ€. μ΄ν κ°μ²΄λ μλλ° κ°μ²΄μ²λΌ μ κ·Όνκ±°λ ν¨μλ‘ νΈμΆνλ λ± λ€μμ μ½λλ μ¨κ° μλ¬λ₯Ό λ°μμν¬ κ²μ΄λ€. νμ§λ§ any νμ
μΌλ‘ μ§μ νμΌλ typescriptμμλ μλ¬λ₯Ό κ°μ§νμ§ λͺ»νλ€.
let foo: any = 10;
// All of these will throw errors, but TypeScript
// won't complain since `foo` has the type `any`.
foo.x.prop;
foo.y.prop;
foo.z.prop;
foo();
new foo();
upperCase(foo);
foo `hello world!`;
function upperCase(x: string) {
return x.toUpperCase();
}
TypeScript
볡μ¬
source of code: microsoft dev blogs, RC announcement
this can be any value, so you must perform some type of checking before you use it - in microsoft dev blog
RC λ°νμ λ°λ₯΄λ©΄, anyμ²λΌ μ΄λ€ νμ
μ valueλ ν λΉν μ μμΌλ©΄μ μ€μ λ‘ μ¬μ©ν λλ κ°λ°μλ‘ νμ¬κΈ νμ
μ 체νΉνλλ‘ λ§λ€ μ μλ νμ
μ΄ νμνλ€. κ·Έλμ μ‘°κΈ λ μμ©μ μΈ unknown νμ
μ λ§λ€κ² λ κ²μ΄λ€.
μ¬μ©μλ‘λΆν° μ
λ ₯μ λ°κ±°λ μ μλ €μ§μ§ μμ μΈλΆ APIλ₯Ό μ¬μ©νλ λ± μ€μ λ‘ μ΄λ€ κ°μ΄ μ¬ μ§ λͺ¨λ₯Ό λ, μ΄λ€ κ°μ΄λ ν λΉν μ μμ§λ§ μ μ μ΄νμ κ·Έ κ°μ μ¬μ©ν λλ νμ
체νΉμ ν΄μ μμ νκ² μ¬μ©νκ² νκΈ° μν΄ μΈ μ μλ€.
μκΉμ λ¬λ¦¬ μμ μ½λμμ anyλ₯Ό unknown νμ
μΌλ‘ λ°κΎΈλ©΄ λ¬Έμ κ° λλ μ½λμμ μ μμ μΌλ‘ μλ¬κ° λ°μνλ€.
let foo: unknown = 10;
// Since `foo` has type `unknown`, TypeScript
// errors on each of these usages.
foo.x.prop;
foo.y.prop;
foo.z.prop;
foo();
new foo();
upperCase(foo);
foo `hello world!`;
function upperCase(x: string) {
return x.toUpperCase();
}
TypeScript
볡μ¬
source of code: microsoft dev blogs, RC announcement
λ§μ½ unknown νμ
μ λ³μλ₯Ό μ¬μ©ν λλ μλ μ½λμ²λΌ νμ
κ°λλ₯Ό ν΄μΌνλ€.
let foo: unknown = 10;
function hasXYZ(obj: any): obj is { x: any, y: any, z: any } {
return !!obj &&
typeof obj === "object" &&
"x" in obj &&
"y" in obj &&
"z" in obj;
}
// Using a user-defined type guard...
if (hasXYZ(foo)) {
// ...we're allowed to access certain properties again.
foo.x.prop;
foo.y.prop;
foo.z.prop;
}
// We can also just convince TypeScript we know what we're doing
// by using a type assertion.
upperCase(foo as string);
function upperCase(x: string) {
return x.toUpperCase();
}
TypeScript
볡μ¬
source of code: microsoft dev blogs, RC announcement
&λ‘ typeμ intersectionν λ unknownμ λ€λ₯Έ νμ
μ ν‘μλκ³ , |λ‘ typeμ unionνλ©΄ unknownμ΄ λ€λ₯Έ νμ
μ ν‘μνλ λ±, μ¬λ¬ νΉμ§λ€μ΄ λμ΄λμ΄ μλ€.
