2019独角兽企业重金招聘Python工程师标准>>>

转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)

高级类型

可辨识联合(Discriminated Unions)

你可以合并单例类型,联合类型,类型保护和类型别名来创建一个叫做 可辨识联合的高级模式,它也称做 标签联合或 代数数据类型。 可辨识联合在函数式编程很有用处。 一些语言会自动地为你辨识联合;而TypeScript则基于已有的JavaScript模式。 它具有3个要素:

1. 具有普通的单例类型属性— 可辨识的特征。
2. 一个类型别名包含了那些类型的联合— 联合。
3. 此属性上的类型保护。

interface Interface1 {kind: 'interface1',property1: number,
}interface Interface2 {kind: 'interface2',property2: number,property3: number,
}interface Interface3 {kind: 'interface3',property4: number,property5: number,
}

首先我们声明了将要联合的接口。 每个接口都有 kind属性但有不同的字符串字面量类型。 kind属性称做 可辨识的特征或 标签。 其它的属性则特定于各个接口。 注意,目前各个接口间是没有联系的。 下面我们把它们联合到一起:

type Type = Interface1 | Interface2 | Interface3;

现在我们使用可辨识联合:

function getType(i: Type) {switch (i.kind) {case "interface1":return i.property1 * i .property1;case "interface2":return i.property2 * i.property3;case "interface3":return i.property4 * i.property5;}
}

完整性检查

当没有涵盖所有可辨识联合的变化时,我们想让编译器可以通知我们。 比如,如果我们添加了Interface4到Type,我们同时还需要更新 area:

interface Interface4 {kind: 'interface4',property6: number,
}type Type = Interface1 | Interface2 | Interface3 | Interface4;function getType(i: Type) {switch (i.kind) {case "interface1":return i.property1 * i .property1;case "interface2":return i.property2 * i.property3;case "interface3":return i.property4 * i.property5;}
}

有两种方式可以实现。 首先是启用 --strictNullChecks并且指定一个返回值类型:

function getType(i: Type): number { // error: returns number | undefinedswitch (i.kind) {case "interface1":return i.property1 * i .property1;case "interface2":return i.property2 * i.property3;case "interface3":return i.property4 * i.property5;}
}

因为 switch没有包涵所有情况,所以TypeScript认为这个函数有时候会返回 undefined。 如果你明确地指定了返回值类型为 number,那么你会看到一个错误,因为实际上返回值的类型为 number | undefined。 然而,这种方法存在些微妙之处且 --strictNullChecks对旧代码支持不好。第二种方法使用 never类型,编译器用它来进行完整性检查:

function assertNever(x: never): never {throw new Error("Unexpected object: " + x);
}function getType(i: Type): number { // error: returns number | undefinedswitch (i.kind) {case "interface1":return i.property1 * i .property1;case "interface2":return i.property2 * i.property3;case "interface3":return i.property4 * i.property5;default:return assertNever(i); // error here if there are missing cases}
}

这里, assertNever检查 s是否为 never类型—即为除去所有可能情况后剩下的类型。 如果你忘记了某个case,那么 s将具有一个真实的类型并且你会得到一个错误。 这种方式需要你定义一个额外的函数,但是在你忘记某个case的时候也更加明显。**Tips**
上面的代码是根据官网的逻辑写的,奇怪的是最后一步居然在编译的时候报错了。报错信息如下

$ tsc src/advanced_types_4.ts
src/advanced_types_4.ts:38:26 - error TS2345: Argument of type 'Interface4' is not assignable to parameter of type 'never'.38       return assertNever(i); // error here if there are missing cases~

转载于:https://my.oschina.net/zhangdapeng89/blog/2120175

TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)相关推荐

  1. TypeScript基础入门 - 接口 - 可索引的类型

    转载地址 TypeScript基础入门 - 接口 - 可索引的类型 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.0.11 ...

  2. TypeScript基础入门 - 接口 - 继承接口

    转载地址 TypeScript基础入门 - 接口 - 继承接口 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.0.13 为 ...

  3. TypeScript基础入门 - 泛型 - 泛型类型

    2019独角兽企业重金招聘Python工程师标准>>> 转载 TypeScript基础入门 - 泛型 - 泛型类型 项目实践仓库 https://github.com/durban8 ...

  4. TypeScript基础入门 - 函数 - 简介

    2019独角兽企业重金招聘Python工程师标准>>> 转载 TypeScript基础入门 - 函数 - 简介 项目实践仓库 https://github.com/durban89/ ...

  5. TypeScript基础入门 - 接口 - 简介

    转载地址 TypeScript基础入门 - 接口 - 简介 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.0.6 为了保证 ...

  6. TypeScript基础入门 - 接口 - 可选属性

    2019独角兽企业重金招聘Python工程师标准>>> 转载地址 TypeScript基础入门 - 接口 - 可选属性 项目实践仓库 https://github.com/durba ...

  7. Java从键盘输入n行字符串_Java十四天零基础入门-Java布尔类型

    不闲聊!!!不扯淡!!!小UP只分享Java相关的资源干货 Java布尔类型 在Java语言中布尔类型的值只包括true和false,没有其他值,不包括1和0,布尔类型的数据在开发中主要使用在逻辑判断 ...

  8. 2014-Unity3d基础入门到高级全套全系列视频教程

    加入QQ群302040480或加QQ2521238762,免费索取教程 2014-Unity3d基础入门到高级全套全系列视频教程下载: 1.Unity游戏大鬼战斗制作视频教程 2.游戏蛮牛 第二季 U ...

  9. TypeScript真香系列-高级类型

    前言 TypeScript真香系列的内容将参考中文文档,但是文中的例子基本不会和文档中的例子重复,对于一些地方也会深入研究.另外,文中一些例子的结果都是在代码没有错误后编译为JavaScript得到的 ...

最新文章

  1. windows cmd color颜色设置
  2. Github上AI在银行和保险的应用列表
  3. android listview 开发,android开发之ListView实现
  4. 编译原理 —— 1.2 编译系统的结构(终于弄懂语法和语义的区别了!)
  5. Asp.Net Web API(四)
  6. 3-15Pytorch与分布函数
  7. 东航期货行情接口和交易接口(20190509)
  8. 默认地址路径修改_修改Docker默认路径
  9. 操作系统简答题和论述题
  10. PYTHON_SPLIT
  11. C#-WinForm-发送邮件
  12. Spring xml文件配置——创建bean的三种方式及作用范围、生命周期
  13. Vue 中播放帧动画(抽离方法)
  14. 一周项目实战系列--SpringBoot实现微信点餐系统(1)
  15. textview加下划线
  16. glm/glm.hpp_从GLM到GBM(第2部分)
  17. 解决一个远程主机强迫关闭连接的bug
  18. 四种利用js导出Excel的方法(兼容IE6+、主流浏览器、支持复杂表头和合并单元格)
  19. dnf服务器合并信息,DNF拍卖场系统开放:使徒合区服务器,公共频道物品交易功能...
  20. World一页打印变成两页怎么缩放

热门文章

  1. 2022年G3锅炉水处理考试试题及模拟考试
  2. Jetson Orin 平台相机调试报四次“err_data” 后stream stop,其它平台工作正常
  3. android-smart-image-view源码分析
  4. [普通物理]双缝干涉条纹的计算
  5. 【转载】专访阿里陶辉:大规模分布式系统、高性能服务器设计经验分享
  6. mx linux安装方法,MX Linux 19.1 发布,基于Debian的出色的Linux发行版
  7. 零售业转型升级,一个方法快速解决
  8. Hadoop进入末日?
  9. pb 转到excel表格如何在表格的最上方加上说明文字
  10. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 5 章 编程练习答案