当前位置: 首页 > news >正文

TypeScript 中的“类型”到底是个啥?

4e89937604d7f700d9fb047d5aac92cc.gif

TypeScript 是带有类型语法的 JavaScript,它是一种建立在 JavaScript 基础上的强类型编程语言。它内置了常见的基础类型,比如 string、number 和 boolean 等类型。

在这些类型的基础上,我们就可以在声明变量时,显式声明变量的类型。

let name: string = "阿宝哥"

那么在 TypeScript 中,类型到底是什么呢?其实你可以把类型理解成一系列值的集合。比如,你可以把数字类型看作是所有数字的集合,1.0、68  就属于这个集合中,而 “阿宝哥” 就不属于这个集合,因为它属于字符串类型。

对于集合来说,最小的集合是空集,它不包含任何值。在 TypeScript 中与之对应的类型是 never 类型。因为它的域是空的,所以没有值可以赋给 never 类型的变量:

let num: never = 123; // Error
let name: never = "阿宝哥"; // Error

下一个最小的集合是包含单个值的集合。在 TypeScript 中与之对应的类型是字面量类型,也称为单元类型(Unit Type)。

type A = "A";
type B = "B";

let a: A = "A" // Ok
let b: B = "A" // Error

既然有单个值的集合,那么有两个值的集合么?答案是有的,boolean 类型就是含有 true 和 false 值的集合。

此外,我们也可以使用操作符 把字面量类型组合成新的类型,也被称为联合类型。

type AB = 'A' | 'B'; 

let a: AB= 'A' // Ok
let c: AB = "C" // Error

除了有限集合之外,我们前面介绍的 string 和 number 类型是属于无限集合。此外,为了满足不同的开发需求,TypeScript 还允许我们自定义类型。比如,这里使用 interface 关键字定义 3 种类型。

interface Vector1D { x: number; }  
interface Vector2D { x: number; y: number; }  
interface Vector3D { x: number; y: number; z: number; }

其中 Vector1D 类型表示含有 x 属性且属性值的类型是 number 类型对象的集合。而 Vector2D 类型表示同时含有 x、y 属性且属性值的类型都为 number 类型对象的集合。

为了便于大家的理解,我们使用 JS 表达式来描述上述的规则:

v1 && typeof v1 === "object" && typeof v1.x === "number" // Vector1D
v2 && typeof v2 === "object" && typeof v2.x === "number" && typeof v2.y === "number" // Vector2D

其实对于上面的 3 种类型来说,我们也可以通过 extends 来扩展已有的接口类型:

interface Vector1D { x: number; }
interface Vector2D extends Vector1D { y: number; } 
interface Vector3D extends Vector2D { z: number; }

在使用标称类型系统的语言中,比如 Java、C++。通常会使用 class 来描述对象类型,Vector1D 类会被称为父类,Vector2D 类被称为子类。

然而 TypeScript 为了更好地与使用鸭子类型的 JavaScript 相兼容,采用了结构化类型系统。在该类型系统中 Vector1D  被称为 SuperType,而 Vector2D 被称为 SubType。

这种关系通常被画成一个层次结构,但从集合的角度考虑,用文氏图更合适。

ab90750508e2b8e24e41eb5b700b4e7c.gif

文氏图是在所谓的集合论数学分支中,在不太严格的意义下用以表示集合的一种草图。它们用于展示在不同的事物集合之间的数学或逻辑联系,尤其适合用来表示集合之间的“大致关系”。

43e7c011b66929db7c0beaf713297dab.png

这里 3 种类型之间关系对应的文氏图是这样的。

400fc3f645027d5cec1638e66ebfb3ba.gif

现在我们来做个总结,相比父类型 Vector1D,子类型 Vector2D 会包含更多的属性,即描述的对象更为精确。Vector2D 子类型对应的集合包含于 Vector1D 父类型对应的集合中。

学完这些有什么用呢?让我们来看个例子:

interface Vector1D { x: number; }  
interface Vector2D { x: number; y: number; }  
type SubtypeOf<T,U> = T extends U ? true : false

type A = SubtypeOf<Vector2D, Vector1D> // true
type B = SubtypeOf<Vector1D, Vector1D> // true
type C = SubtypeOf<Vector1D, Vector2D> // false

了解 TS 中的类型和所采用的结构化类型系统是 TS 进阶的关键,值得你好好学习一番。

推荐阅读

市面上讲解类型系统的书不常见,现在终于有一本书填补了类型系统的理论和实践的空白:由Microsoft的首席软件架构师弗拉德.里斯库迪亚(Vlad Riscutia)撰写的《Programming With Types》,中文版《编程与类型系统 》现已上市。本书涵盖了关于类型的你需要知道的一切信息,从布尔类型到单子,这本书为你保驾护航。

82ed653b91fefe72de245099b2a9bb0c.png

《编程与类型系统》 

[Programming With Types]

作为一名开发人员,在日常工作中巧妙地使用类型能够写出更好的代码,提高查找与数据相关的棘手错误的效率。本书讲解基于类型的技术,可用来编写安全、正确和容易维护的软件。 

这本清晰易懂的教程主要面向有一定编程经验(如TypeScript、Java、JavaScript、C#或C++等主流编程语言使用经验)的开发人员,侧重于介绍类型系统为日常编程工作带来的实用好处。

通过学习使用TypeScript编写的真实示例,你将全面了解类型系统在编程中的应用技巧。


TypeScript入门:TypeScript入门与实战

TypeScript进阶:TypeScript项目开发实战

更多新书

书讯 | 4月书讯(下)| 上新了,华章

书讯 | 4月书讯(上)| 上新了,华章

Webpack实战:入门、进阶与调优(第2版)

工业物联网:平台架构、关键技术与应用实践

数据安全实践指南

Web渗透测试实战:基于Metasploit 5.0

dcf96310cf6c5c55f485e2d286ef44c4.gif

相关文章:

  • Koa开发:Node服务中非常重要的概念——进程管理
  • 从loser到产品大牛,你经历的我都经历了
  • 读书会 | 为什么《数据中台:让数据用起来》,值得每个数据人读?
  • 重新思考企业架构
  • 概率为何反直觉?
  • 手把手教你用Pandas 合并两行为一行并调整行顺序
  • C++20 用微软的提案进入协程时代!
  • 构建系统软件三步走,这些书你不可错过!
  • 数字经济下半场中,金融企业应该如何进行数字化经营呢?
  • ClickHouse为啥在字节跳动能这么火?
  • 计算机如何大规模协作?
  • 终于有人把元数据讲明白了
  • Go语言精进之路:你知道什么是Go语言编程思维吗?
  • Java冷启动慢?不存在的!
  • 分布式系统一致性的本质,看这篇秒懂
  • ES6系列(二)变量的解构赋值
  • ESLint简单操作
  • EventListener原理
  • Laravel核心解读--Facades
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP面试之三:MySQL数据库
  • vue:响应原理
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 前端工程化(Gulp、Webpack)-webpack
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 温故知新之javascript面向对象
  • 详解NodeJs流之一
  • 协程
  • 用element的upload组件实现多图片上传和压缩
  • 中文输入法与React文本输入框的问题与解决方案
  • 你对linux中grep命令知道多少?
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #pragma once与条件编译
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (层次遍历)104. 二叉树的最大深度
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十六)一篇文章学会Java的常用API
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (新)网络工程师考点串讲与真题详解
  • (译)计算距离、方位和更多经纬度之间的点
  • .htaccess配置重写url引擎
  • .NET Core中Emit的使用
  • .net Stream篇(六)
  • .NET 读取 JSON格式的数据
  • .NET中winform传递参数至Url并获得返回值或文件
  • /etc/shadow字段详解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [4.9福建四校联考]
  • [51nod1610]路径计数
  • [AX]AX2012 R2 出差申请和支出报告