Search

[Typescript] unknown vs any type

subtitle
unknown vs any type
Tags
typescript
Created
2021/04/27
2 more properties

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
이외에도 unknown νƒ€μž…μ˜ νŠΉμ§•μ„ μ‚΄νŽ΄λ³΄κ³  μ‹Άλ‹€λ©΄ PR을 직접 확인해도 μ’‹λ‹€.
&둜 type을 intersectionν•  λ•Œ unknown은 λ‹€λ₯Έ νƒ€μž…μ— 흑수되고, |둜 type을 unionν•˜λ©΄ unknown이 λ‹€λ₯Έ νƒ€μž…μ„ ν‘μˆ˜ν•˜λŠ” λ“±, μ—¬λŸ¬ νŠΉμ§•λ“€μ΄ λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

references