前言
你能说清楚类型
、类型系统
、类型检查
这三个的区别吗?在理解TypeScript
的结构化类型系统之前,我们首先要搞清楚这三个概念和它们之间的关系
- 类型:即对变量的访问限制与赋值限制。如 TypeScript 中的原始类型、对象类型、函数类型和字面量类型等类型,当一个变量类型确定后,你不能访问这个类型中不存在的属性或方法,也不能将其他不兼容的类型的变量赋值给该变量
- 类型系统:本质上是一组规则,其描述如何为变量、函数等结构分配和实施类型。同时还定义了如何判断类型之间的兼容性,也正是我们今天主要讨论的概念
- 类型检查:是一种能力,一种确保类型遵循类型系统下的类型兼容性的能力
理解它们对理解我们今天要讨论的TypeScript的结构化类型系统
很有帮助
类型系统分为结构化类型系统
和标称类型系统
,首先我们来看看它们分别都是什么
什么是结构化类型系统?
基于类型结构进行类型兼容性判断
关键体现在两个类型的比较当中,当两个类型比较时,如果是按照属性和方法是否相同来比较的话就称为结构化类型系统,也叫鸭子类型。
比如下面这个例子:
class Dog {say() {console.log('wang wang wang!')}
}
class Cat {say() {console.log('miao miao miao!')}
}
const invokeSay = (dog: Dog) => {dog.say()
}
const dog = new Dog()
const cat = new Cat()
invokeSay(dog) // wang wang wang!
invokeSay(cat) // miao miao miao!
虽然invokeSay
函数接收的参数类型是Dog
,但是由于Cat
类型的结构和<