前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >TypeScript中的类型断言

TypeScript中的类型断言

作者头像
疯狂的技术宅
发布于 2020-06-19 03:52:06
发布于 2020-06-19 03:52:06
3.8K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行

翻译:疯狂的技术宅

作者:Dr. Axel Rauschmayer

正文共:1820 字

预计阅读时间:10 分钟

本文是关于 TypeScript 中的 type assertions 的,它与其他语言中的类型强制转换有相似之处,并通过 as 运算符执行。


类型断言

类型断言使我们可以覆盖 TypeScript 为存储位置计算的静态类型,这对于解决类型系统的限制很有用。

类型断言与其他语言中的类型强制转换有相似之处,但是它们不会引发异常,并且在运行时也不做任何事情(它们确实会静态执行一些少量的检查)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1const data: object = ['a', 'b', 'c']; // (A)
2
3// @ts-ignore: Property 'length' does not exist on type 'object'.
4data.length; // (B)
5
6assert.equal(
7  (data as Array<string>).length, 3); // (C)
  • 在 A 行中,我们把 Array 的类型扩展为 object
  • 在 B 行中,我们看到此类型不允许访问任何属性。
  • 在 C 行中,我们用类型断言(运算符 as)告诉 TypeScript data 是一个Array。现在就可以访问属性 .length 了。

类型断言是不得已的方法,应尽可能的避免。他们(暂时)删除了静态类型系统为我们提供的安全网。

注意,在 A 行中,我们还覆盖了 TypeScript 的静态类型,不过是通过类型注释完成的。这种覆盖方式比类型声明要安全得多,因为你可以做的事情少得多。TypeScript 的类型必须能够分配给注释的类型。

类型断言的替代语法

TypeScript 对于类型断言有另一种“尖括号”语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1<Array<string>>data

该语法已经过时,并且与 React JSX 代码(在 .tsx 文件中)不兼容。

示例:声明一个接口

为了访问任意对象 obj 的属性 .name,我们暂时将 obj 的静态类型更改为 Named(A行和B行)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1interface Named {
2  name: string;
3}
4function getName(obj: object): string {
5  if (typeof (obj as Named).name === 'string') { // (A)
6    return (obj as Named).name; // (B)
7  }
8  return '(Unnamed)';
9}

示例:声明索引签名

在以下代码中,我们在行 A 用了类型断言 as Dict ,以便可以访问其推断类型为 object 的值的属性。也就是说,用静态类型 Dict 覆盖了推断的静态类型 object

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1type Dict = {[k:string]: any};
 2
 3function getPropertyValue(dict: unknown, key: string): any {
 4  if (typeof dict === 'object' && dict !== null && key in dict) {
 5    // %inferred-type: object
 6    dict;
 7
 8    // @ ts-ignore:元素隐式具有“any”类型,因为
 9    // 类型'string'的表达式不能用于索引类型'{}'。
10    // 在类型“ {}”上没有找到参数类型为'string'的索引签名。
11    dict[key];
12
13    return (dict as Dict)[key]; // (A)
14  } else {
15    throw new Error();
16  }
17}

与类型断言相关的构造

非空断言运算符(后缀 `!`)

如果值的类型是包含 undefinednull 类型的联合,则 non-nullish声明运算符(或 non-null 声明运算符)将从联合中删除这些类型。我们告诉 TypeScript:“这个值不能是 undefinednull。”因此,我们可以执行这两个值的类型所阻止的操作,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1const theName = 'Jane' as (null | string);
2
3// @ts-ignore: Object is possibly 'null'.
4theName.length;
5
6assert.equal(
7  theName!.length, 4); // OK
示例 – Maps: `.has()` 之后的 `.get()`

使用 Map 方法 .has() 之后,我们知道 Map 具有给定的键。遗憾的是,.get() 的结果不能反映这一点,这就是为什么我们必须使用 nullish 断言运算符的原因:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1function getLength(strMap: Map<string, string>, key: string): number {
2  if (strMap.has(key)) {
3    // We are sure x is not undefined:
4    const value = strMap.get(key)!; // (A)
5    return value.length;
6  }
7  return -1;
8}

由于 strMap 的值永远不会是 undefined,因此我们可以通过检查 .get() 的结果是否为 undefined 来检测丢失的 Map 条目(A 行):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1function getLength(strMap: Map<string, string>, key: string): number {
 2  // %inferred-type: string | undefined
 3  const value = strMap.get(key);
 4  if (value === undefined) { // (A)
 5    return -1;
 6  }
 7
 8  // %inferred-type: string
 9  value;
10
11  return value.length;
12}

定值断言

如果打开 strict 属性初始化,有时需要告诉 TypeScript 我们确实初始化某些属性——即使它认为我们不需要这样做。

这是一个例子,尽管 TypeScript 不应这样做,但它仍会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1class Point1 {
 2  // @ts-ignore: Property 'x' has no initializer and is not definitely
 3  // assigned in the constructor.
 4  x: number;
 5
 6  // @ts-ignore: Property 'y' has no initializer and is not definitely
 7  // assigned in the constructor.
 8  y: number;
 9
10  constructor() {
11    this.initProperties();
12  }
13  initProperties() {
14    this.x = 0;
15    this.y = 0;
16  }
17}

如果我们在 A 行和 B 行中使用“定值分配断言”(感叹号),则错误会消失:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1class Point2 {
 2  x!: number; // (A)
 3  y!: number; // (B)
 4  constructor() {
 5    this.initProperties();
 6  }
 7  initProperties() {
 8    this.x = 0;
 9    this.y = 0;
10  }
11}

原文链接

https://2ality.com/2020/06/type-assertions-typescript.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何制作电热水壶标签
电热水壶是家家必不可少的,平常我们在喝水的时候,一般都是使用家里的电热水壶,有了它,可以让烧水时间短、效率高。购买此类产品时,我们可以观察一下出售的水壶是否带有标签,根据标签上的信息,就大概可以知道水壶的质量。由此可见产品标签的重要性。下面小编就给大家演示如何制作电热水壶标签。
神奇像素科技
2022/01/17
5250
如何制作电热水壶标签
如何制作糖果标签
马上要新年了,每家每户都会准备一些糖果,糖果在春节已经是一种不可缺少的小零食了。现在的糖果种类真是五花八门,各种口味都有,细心的朋友在购买时还会关注外包装上关于产品的一些介绍,比如产品的配料,存储条件,营养成分等。由此可见标签对于一个产品的重要性。下面我们就一起来看看糖果标签是如何制作的。
神奇像素科技
2022/01/18
9230
如何制作糖果标签
如何制作精油分类标签
如果提到精油,相信大家都不会感到陌生,精油是天然香料的一种,它存在于植物的油腺或腺毛中,也存在于树脂中。很多精油爱好者平时会购置储备很多种精油,那如何给精油做个分类,方便拿取使用呢?其实给精油制作一个分类标签就可以了。下面我们就使用条码软件来制作精油分类标签。
神奇像素科技
2022/01/17
3560
如何制作精油分类标签
如何制作中药房药柜上的标签
平时我们去医院的中药房取药,都会看到排列的整整齐齐的药柜,药柜上粘贴着带有中药名字的标签,这些中药按照一定的顺序排列在药斗橱内,使用标签可以便于调剂操作、减轻劳动强度、避免出错,保证患者用药安全。下面小编就演示如何制作此类标签。
神奇像素科技
2022/01/12
4010
如何制作中药房药柜上的标签
如何制作配电箱标签
现在每个小区的楼道里都会有个配电箱,配电箱上会粘贴一个标签,这个标签上面有配电箱的编号、级别、责任人、联系电话等等信息,方便用户通过标签来了解一下相关的信息。这样的标签也是可以用条码标签软件来制作的,下面我们就看看具体操作方法。
神奇像素科技
2022/01/21
6250
如何制作配电箱标签
如何制作保修标签
我们购买一件商品时会发现有多个标签,不单单只是产品标签,一些电子类产品,因为会涉及到后续的维修问题,所以还会在产品的重要位置粘贴一个保修标志的标签,这类标签是用来证明你的东西没有被拆解破坏过,撕了的话可能就不能享受免费保修了,商家也就会收费维修了。下面小编就给大家演示一下如何制作这样的保修标签。
神奇像素科技
2022/01/10
4070
如何制作保修标签
如何批量打印考场标签
又到了学校期末考试的时候了,现在考试都会给每个学生准备一个考场标签,上面有学生的姓名、编号等信息,而且还会有一个条形码,可以通过扫描条形码来进行电脑阅卷和评分,大大提高了老师阅卷的工作效率。下面我们就使用条码标签软件来批量制作这样的考场标签。
神奇像素科技
2022/01/13
1.1K0
如何批量打印考场标签
怎样制作易碎标签
我们平时在网上购买一些易碎品,比如瓷器、陶器、玻璃制品等,或者是一些怕摔的物品,比如电器、手机等。商家为了防止物品的损坏,一般会在外包装比较显眼的位置粘贴一个易碎标签,主要是为了引起快递员的注意,提醒他轻拿轻放。下面我们就详细介绍该怎样制作这种易碎标签。
神奇像素科技
2022/01/13
7260
怎样制作易碎标签
外箱标签是怎么制作的
外箱标签设计都较为复杂,无论条码类型还是数据都比较多,且在出库时每个标签上的条码、数字一般都是流水变化的。外箱标签一般包含了供应商、收货人、产品编码、生产日期、发货日期等信息。下面我们就看看这样的外箱标签是如何制作的。
神奇像素科技
2022/01/11
1.2K0
外箱标签是怎么制作的
给家里的垃圾桶做个分类标贴
现在所有的垃圾都需要垃圾分类,不管是小区里还是在公共场所,我们都可以看到不同颜色的垃圾桶,上面粘贴着标签,标签上会有一些图片的标注,这些标注可以起到提示作用,方便大家分类投放。垃圾分类需要我们在源头就要控制好,所以家里也需要准备多个垃圾桶,在垃圾桶上粘贴上分类标签就可以了,下面我们就看看如何制作这样的标签吧。
神奇像素科技
2022/01/14
3990
给家里的垃圾桶做个分类标贴
如何制作纺织产品标签
标识标签是纺织类产品向消费者传达其产品品质特征信息的重要载体,人们在挑选纺织产品时往往是从标识标签开始的,它能协助消费者正确认识产品质量,从而选择更适合的商品。同时,保证标识标签的信息完整及准确也利于树立企业的质量形象,增加消费者对企业产品质量的信任感。下面我们就一起看看如何制作纺织产品标签。
神奇像素科技
2022/01/19
3150
如何制作纺织产品标签
如何让文字压在边框上
有很多用户在使用条码标签软件制作产品标签的时候,都会有各种各样的设计要求,这些个性化的需求,在制作的时候是需要一些小技巧的,今天我们要介绍的这样的一种效果,文字压在边框上,会遮挡住一部分边框。如何制作呢,下面开始介绍。
神奇像素科技
2022/01/20
1K0
如何让文字压在边框上
如何批量生成JAN13条码
有朋友咨询怎么制作JAN13条码,其实JAN13条码和国际通用的EAN13码编码规则完全一致,只需要输入12位条码数据,条码软件会自动计算校验位。唯一不同的是JAN13条码的前两位数字必须是45或者49开头,45或者49是日本的国际代码,就如我们国家是69开头的一样。下面我们就看看如何批量生成JAN13条码
神奇像素科技
2022/01/19
7560
如何批量生成JAN13条码
如何制作食品营养成分标签
食品营养成分标签是包装食品标签的一部分,有着重要的作用,可以向消费者提供食品营养信息和特性的说明。营养成分表有食品营养成分名称、含量和占营养素参考值百分比等内容。营养成分表内容应以“方框表”的形式表示,字体和颜色要清晰。下面小编就演示如何制作食品营养成分标签。
神奇像素科技
2022/01/07
1K0
如何制作食品营养成分标签
如何制作图书专用标签
在学校的行政事务中常常面临着需要管理一大堆的书籍,为了方便书籍管理,我们需要给图书进行分类,并且粘贴标识性的标签,用于记录图书分类,方便查找和管理。接下来小编使用条码软件演示如何制作图书标签的方法
神奇像素科技
2022/01/25
1K0
如何制作图书专用标签
如何批量生成个位随机数字
众所周知,条码软件可以批量打印条码二维码以及各种各样的产品标签,功能比较齐全,在输入数据时有各种类型,比如手动输入、计数器生成、数据库字段、日期时间、序列生成、流水号等等。今天小编给大家介绍如何随机生成个位数字。
神奇像素科技
2022/01/17
1.3K0
如何批量生成个位随机数字
多个条码标签如何在一张纸上打印
我们通过数据库,流水号等批量生成条码时,一般都是使用标签打印机打印在专门的标签纸上。但是也有一种情况就是将批量生成的条码打印在一张纸上,具体如何操作小编将详细介绍。
神奇像素科技
2022/01/21
1.7K0
多个条码标签如何在一张纸上打印
怎样制作衬衣合格证
工厂在生产产品的时候,最后通过检验,合格的产品都会有一个合格证,这种合格证在日常生活和工作中随处可见,比如服装、纺织、鞋帽、电器、箱包、家电等行业都有应用。合格证就是表明出厂的产品经质量检验是合格的,也是生产者对其产品质量作出的保证。下面我们以服装行业为例子,做一个衬衣合格证。
神奇像素科技
2022/01/06
6670
怎样制作衬衣合格证
如何批量制作扫描后即可在线阅读的二维码
由于二维码在日常生活中应用比较广泛,因此受到很多行业的青睐。随着手机功能的增强,我们平时会使用手机上网,甚至连一些报纸行业也开始进军互联网行业,而它们的媒介就是二维码。读者可以通过手机对报纸上的二维码进行扫描,即可观看该条新闻的信息、图片等。但是繁杂的网址输入使得很多用户头疼不已,二维码的出现恰好解决的这一问题,我们只需扫描对应网站地址的二维码即可直接打开该网站,免去了繁杂的网址输入过程。下面我们就看看如何批量制作这样的二维码,扫描后可以实现在线阅读。
神奇像素科技
2022/01/14
6320
如何批量制作扫描后即可在线阅读的二维码
批量生成Code128- C条码
Code128码是一种高密度的一维条码,可以表示全部128个ASCII码字符(数字、字母的大、小写、符号和控制符),所以称128码。而Code128 A码,Code128 B码,Code128 C码都是Code128码的子集,Code128 C码仅可以表示100个“两位”数字编码(00-99),比如:123456、90870965。下面我们就看看如何批量生成Code128- C条码。
神奇像素科技
2022/01/10
1.1K0
批量生成Code128- C条码
相关推荐
如何制作电热水壶标签
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文