大家好,我是 CUGGZ。
JavaScript 是一门弱类型语言,它对类型是弱校验,正因为这个特点,所以才有了TypeScript这个强类型语言系统的出现,来弥补类型检查的短板。TypeScript在实现类型强校验的同时,还要满足 JavaScript 灵活的特点,所以就有了类型兼容性这个概念。了解类型兼容性可以避免在实际的开发中出现一些低级错误。下面就来看看类型兼容性的概念和分类。
1、类型兼容性的概念
所谓的类型兼容性 用于确定一个类型是否能赋值给其他类型 。TypeScript中的类型兼容性是 基于结构类型 的,结构类型是一种只使用其成员来描述类型的方式。其基本原则是, 如果 x 要兼容 y,那么 y 至少要具有与 x 相同的属性。
下面来看一个例子,构建一个 Teacher 类 ,然后声明一个接口 Student,Student 的属性 Teacher 都有,而且还多了其他的属性,这种情况下 Student 就兼容了 Teacher:
class Teacher { constructor(public weight: number, public name: string, public job: string) { } } interface Student { name: string weight: number } let x: Student; x = new Teacher(120, 'TS', 'teacher') // :white_check_mark:
如果反过来,Teacher 并没有兼容 Student,因为 Student 的属性比 Person 少一个。
2、特殊类型的类型兼容性
先来看看 TypeScript 中一些特殊类型的类型兼容性。
(1)any
any 类型可以赋值给除了 never 之外的任意其他类型,反过来其他类型也可以赋值给 any。也就是说 any 可以兼容除了 never 之外的所有类型,同时也可以被所有的类型兼容。
let any: any; let a: number = any; // :white_check_mark: let b: {} = any; // :white_check_mark: let b: () => number = any; // :white_check_mark:
(2)never
never 类型可以赋值给任何其他类型,但不能被其他任何类型赋值。
let never: never = (() => { throw Error('never'); })(); let a: number = never; // :white_check_mark: let b: () => number = never; // :white_check_mark: let c: {} = never; // :white_check_mark:
可以看到,这里将