在 TypeScript中,any 和 unknown 是包含所有值的类型。在本文中,我们将会研究它们是怎样工作的。
any 和 unknown 在 TypeScript 中是所谓的“顶部类型”。以下文字引用自 Wikipedia:
top type [...]是 通用(universal) 类型,有时也称为 通用超类型,因为在任何给定类型系统中,所有其他类型都是子类型[...]。通常,类型是包含了其相关类型系统中所有可能的[值]的类型。
也就是说,当把类型看作是值的集合时,any 和 unknown 是包含所有值的集合。顺便说一句,TypeScript 还有 bottom type never,它是空集。
如果一个值的类型为 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() 的结果取决于动态输入,这就是其返回类型为 any 的原因(我从函数签名中省略了参数 reviver):
JSON.parse(text: string): any;
在 unknown 类型出现之前,JSON.parse() 就已经被添加到了 TypeScript中。否则它的返回类型可能会是 unknown。
把任意值转换为字符串的函数 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);
}
}
原文:https://2ality.com/
本文首发微信公众号:前端先锋
近些日子,我使用了新语言编程,从JavaScript,切确地说是Elm,转成TypeScript。在本文中,我将继续深挖一些我非常喜欢的TypeScript特性。
TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集,但是 TypeScript 与 JavaScript 之间又有什么样的区别呢?
Nerv_是一款由京东凹凸实验室打造的类 React 前端框架,基于虚拟 DOM 技术的 JavaScript(TypeScript) 库。它基于React标准,提供了与 React 16 一致的使用方式与 API。
交叉类型:将多个类型合并为一个类型、联合类型:表示取值可以为多种类型中的一种、混合类型:一个例子就是,一个对象可以同时做为函数和对象使用,并带有额外的属性、类型断言:可以用来手动指定一个值的类型
在做比较大的,多人合作的项目的时候,TypeScript会更加地适合,这得益于它的可读性,面向对象性以及易于重构的特点。但如果只是自己做小程序,不需要太多人参与的时候,JavaScript则会更加简单。
有两种方式安装TypeScript,如何创建第一个TypeScript文件,在TypeScript中,可以使用interface来描述一个对象有firstName和lastName两个属性,TypeScript支持JavaScript的新功能,其中很重要的一个功能就是基于类的面向对象编程
使用TypeScript已经有了一段时间,这的确是一个好东西,虽说在使用的过程中也发现了一些bug,不过都是些小问题,所以整体体验还是很不错的。有关TypeScript声明类型声明相关的目前就总结了这些比较常用的
谷歌在很早之前就张开双臂拥抱 Web 应用程序,Gmail 已经发布 14 年了。当时,JavaScript 的世界是疯狂的。Gmail 工程师不得不为 IE 糟糕的垃圾回收算法捏一把汗,他们需要手动将字符串文字从 for 循环中提取出来,以避免 GC 停顿
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行,并且是开源的。
差不多两年前,我在一个创业团队中开始了一个全新的项目。用到的全都是类似Microservices,docker,react,redux这些时髦的东西。我在前端技术方面积累了一些类似的经验
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!