const foo: unknown = 10; const bar: any = foo; const bar2: unknown = foo; // 下面*開發時期*每一行都會跳警告 const bar3: number = foo; // unknown 只能指派給 unknown const bar4: string = foo; // unknown 只能指派給 unknown foo.x.prop; // unknown 不能直接操作屬性、方法、建構式 foo.y.prop; foo.z.prop; foo(); new foo(); upperCase(foo); foo`hello world!`; function upperCase(x: string) { return x.toUpperCase(); } foo.toFixed(1); // error! 即使目前實際型別是數字,仍不能直接對 unknown 操作 if (typeof foo === 'number') { foo.toFixed(1); // ok. TypeScript 推斷是 number 型別 } if (typeof foo === 'string') { foo.toUpperCase(); // ok. TypeScript 推斷是 string 型別 } const foo2 = foo as string; // 強制轉型 foo2.toUpperCase(); // ok. 因為 foo2 現在被轉型成 string 型別
unknown
类型是any
类型的扩展,之前any
类型定义之后是可以接受任何类型的,这样的操作会直接导致类型模糊,回到之前的弱类型状态
使用unknown
类型后,不能再赋值给具体的类型了,即使明确的赋值给具体的类型,也不会进行类型的推导,使用下列两个方法可以进行正常的类型判断
- 使用
typeof
对unknown
进行类型判断 - 进行类型的
as
声明