typescript命名注意事项(TypeScript中的any和unknown有区别吗)(1)

在TypeScript中,any和unknown是包含所有值的类型。在这里,我们将研究它们是如何工作的。

TypeScript的两个顶级类型

TypeScript的两个顶级类型any和unknown是TypeScript中所谓的顶级类型。引用维基百科:

The top type [...] is the universal type, sometimes called the universal supertype as all other types in any given type system are subtypes [...]. In most cases it is the type which contains every possible [value] in the type system of interest.

也就是说,当将类型视为值集时,any和unknown是包含所有值的集。另外,TypeScript还有底层的never类型,即空集合。

any

如果某个值的类型为any,我们可以对其执行所有操作:

function func(value: any) { 5 * value; value.propName; value[123]; }

每种类型都可分配给any:

let storageLocation: any; storageLocation = null; storageLocation = true; storageLocation = {};

any类型也可以分配给任何其他类型:

function func(value: any) { const a: null = value; const b: boolean = value; const c: object = value; }

对于any类型,我们都会失去TypeScript的静态类型系统提供给我们的保护。因此,只有我们不能使用更具体的类型或unknown时,才能将any作为最后手段使用。

例如:JSON.parse()

JSON.parse()取决于动态输入,这就是返回类型为any的原因:

JSON.parse(text: string): any;

JSON.parse()是在unknown类型之前添加到TypeScript语言中的。如果不是,那么它的返回类型可能就会被定义为unknown。

unknown

unknown类型是any类型的安全版本。每当你想用any时,试着先用unknown。

在任何允许我们做任何事情的地方,unknown的限制要大得多。

在对unknown类型的值执行任何操作之前,必须首先通过以下方式缩小其类型:

function func(value: unknown) { // Type assertion: (value as number).toFixed(2); } function func(value: unknown) { if (value === 123) { // equality value; value * 5; } } function func(value: unknown) { if (typeof value === 'string') { // type guard value; value.length; } } function func(value: unknown) { assertionFunction(value); value; value.test('abc'); } function assertionFunction(arg: unknown): asserts arg is RegExp { if (! (arg instanceof RegExp)) { throw new TypeError('Not a RegExp: ' arg); } }

,