类型系统是TS最主要的功能,即给JS添加静态类型检查,要想实现类型检查,首先就要有类型系统。TS可以帮助我们提供代码的扩展性和可维护性。
对于两者类型的理解
JavaScript 中的类型其实是值的类型。TypeScript 中的类型其实是变量的类型。
对于JS而言,一个变量可以是任意类型,而对于TS来说一个变量只能接受和它兼容的类型的值。
类型空间和值空间
TypeScript 既会对变量存在与否进行检查,也会对变量类型进行兼容检查。因此 TypeScript 就需要定义一系列的类型,以及类型之间的兼容关系。
在TS中,类型和值居住不同的,甚至不知道彼此的存在,类型不能当做值来用,反之亦然。
类型空间
const aa:user = {name:"LL",age:"20"}
上面的代码会报类型找不到的错,而以下用interface声明一下User就行了
interface User{
name:string,
age: string;
}
const aa: User = {name:'LL',age:"20"}
也就是说使用interface可以在类型空间声明 一个类型,这个是TS的类型检查的基础之一。
实际上类型空间内部也会有子空间,我们可以用namespace和module来创建新的子空间。子空间之间不能直接接触,需要依赖导入 导出来交互。
值空间
const a = window.LL();
Typescript 会报告一个类似Property ‘LL’ does not exist on type ‘Window & typeof globalThis’. 的错误。也就是说找不到成员变量
declare var LL:() =>any
这样又好了,也就是说使用declare可以在值空间声明 一个变量,这个是TS的变量检查的基础;
类型是怎么做到静态检查的
TS解决JS动态语言类型太宽松的问题,需要 :
- 提供给变量设定类型的能力: 通过类型注解的语法来完成
- 提供常用类型并可以扩展出自定义类型:TS提供了注入lib.d.ts等类型库文件
- 根据第一步给变量设定的类型进行类型检查,即不允许类型不兼容的赋值,也不允许使用值空间和类型空间不存在的变量和类型: Typescript 主要是通过 interface,type,函数类型等打通「类型空间」,通过 declare 等打通「值空间」,并结合 binder 来进行类型诊断。
类型系统的主要功能
- 定义类型以及其上的属性和方法
- 提供自定义类型的能力
- 类型兼容体系
- 类型推导
参考文章:https://mp.weixin.qq.com/s/rmiJIO8Apo0CkX-aC_Uzew