TypeScript 3.0 中新增了一种 unknown
类型。
unknown
is the type-safe counterpart ofany
. Anything is assignable tounknown
, butunknown
isn’t assignable to anything but itself and any without a type assertion or a control flow based narrowing. Likewise, no operations are permitted on anunknown
without first asserting or narrowing to a more specific type.
简单来说,unknown
是一种更加安全的 any
的副本。所有东西都可以被标记成是 unknown
类型,但是 unkonwn
必须在进行类型判断和条件控制之后才可以被分配成其他类型,并且在类型判断和条件控制之前也不能进行任何操作。
一些常见的使用案例可以参考官方文档
我这边举出一个很常见的使用场景。
假设我们在一个 TypeScript 项目中,引入了一个 JavaScript 编写的库,这个库通过单独的 TypeScript declaration 文件提供 TypeScript 支持,那么就可能存在一种情况。
import { method } from 'js-lib';
const method = (some: SomeType) => void;
method()
在 .d.ts
中声明的参数类型是 SomeType
,但是它实际接受另一种类型的参数,比如 null
。
// 如果直接传入 null,那么编译器就会报错
method(null);
// Error: Argument of type 'null' is not assignable to parameter of type 'SomeType'
这种情况下就可以利用 unknown
类型来实现传入 null。
method(null as unknown as SomeType);
这样就可以正常通过编译器的类型校验了。
当然最好还是编写正确的 declaration 文件。