做者:Dr. Axel Rauschmayer翻译:疯狂的技术宅html
原文:https://2ality.com/2020/06/an...前端
未经容许严禁转载程序员
在 TypeScript中,any
和 unknown
是包含全部值的类型。在本文中,咱们将会研究它们是怎样工做的。面试
any
and unknown
are so-called top types in TypeScript. Quoting Wikipedia:typescript
any
和 unknown
在 TypeScript 中是所谓的“顶部类型”。如下文字引用自 Wikipedia:segmentfault
top type [...]是 通用(universal) 类型,有时也称为 通用超类型,由于在任何给定类型系统中,全部其余类型都是子类型[...]。一般,类型是包含了其相关类型系统中全部可能的[值]的类型。
也就是说,当把类型看做是值的集合时,any
和 unknown
是包含全部值的集合。顺便说一句,TypeScript 还有 bottom type never
,它是空集。数组
any
若是一个值的类型为 any
,那么咱们就能够用它任何事:安全
function func(value: any) { // 仅容许数字,但它们是 `any` 的子类型 5 * value; // 一般,`value` 的类型签名必须包含 .propName 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
,则只能将其用做最后的手段。
JSON.parse()
JSON.parse()
的结果取决于动态输入,这就是其返回类型为 any 的缘由(我从函数签名中省略了参数 reviver
):
JSON.parse(text: string): any;
在 unknown
类型出现以前,JSON.parse()
就已经被添加到了 TypeScript中。不然它的返回类型可能会是 unknown
。
String()
把任意值转换为字符串的函数 String()
具备如下类型签名:
interface StringConstructor { (value?: any): string; // call signature // ··· }
unknown
类型是 any
的类型安全版本。每当你想使用 any
时,应该先试着用 unknown
。
在 any
容许咱们作任何事的地方,unknown
的限制则大得多。
在对 unknown
类型的值执行任何操做以前,必须先经过如下方法限定其类型:
function func(value: unknown) { // @ts-ignore: Object is of type 'unknown'. value.toFixed(2); // Type assertion: (value as number).toFixed(2); // OK }
function func(value: unknown) { // @ts-ignore: Object is of type 'unknown'. value * 5; if (value === 123) { // equality // %inferred-type: 123 value; value * 5; // OK } }
function func(value: unknown) { // @ts-ignore: Object is of type 'unknown'. value.length; if (typeof value === 'string') { // type guard // %inferred-type: string value; value.length; // OK } }
function func(value: unknown) { // @ts-ignore: Object is of type 'unknown'. value.test('abc'); assertionFunction(value); // %inferred-type: RegExp value; value.test('abc'); // OK } function assertionFunction(arg: unknown): asserts arg is RegExp { if (! (arg instanceof RegExp)) { throw new TypeError('Not a RegExp: ' + arg); } }