typescript type
类型
- JavaScript中的类型实际上是值的类型,这是动态类型语言的本质。
- TypeScript中的类型实际上是变量的类型,这是静态类型语言的本质。
由于类型与值居住在不同的空间,相互自建不能访问,甚至不知道彼此的存在。因此类型不能当作值来用,反之亦然。
TypeScript类型检查的基础是使用interface
可以在类型空间上声明一个类型,类型空间内部也可以拥有子空间,可以使用namespace
或module
来创建新的子空间,通过import/export
导入导出来相交互。另外,TypeScript中使用declare
可以在值空间上声明一个变量,这是TypeScript变量检查的基础。
TypeScript为JavaScript添加静态类型检查,要实现静态类型检查,首先需要的是类型系统。
TypeScript支持JavaScript中所有的类型,同时支持一些JavaScript中没有的类型(超集)。
TypeScript要想解决JavaScript动态语言类型太宽松的问题
- 需要提供给变量设定类型的能力,通过类型注解的语法实现。
- 需要提供常用类型并可以扩展出自定义的类型,通过提供诸如
lib.d.ts
等类型声明库文件来实现。 - 需要根据给变量设定的类型进行类型检查,禁止类型不兼容的赋值操作,禁止使用值空间和类型空间不存在的变量和类型等。通过
interface
、type
、函数类型等打通类型空间,通过declare
等打通值空间,结合binder
来进行类型诊断checker
。
类型系统
TypeScript的核心是类型系统,由于JavaScript急需一套合适的类型系统来支撑日益规模化的协作开发。
TypeScript和C#都是由微软的Anders Hejlsberg领导开发的编程语言,二者在类型系统上采用了不同的方式,C#采用的是标明类型系统(Norminal Type System),TypeScript考虑到JavaScript自身的灵活性采用的是结构类型系统(Structural Type System)。
总体上来说,面向对象型的语言更多会采用标明类型系统,函数式语言偏向于结构类型系统。然而JavaScript是一种非常独特的语言,两种编程范式兼而有之。
JavaScript是一门动态脚本语言,鸭子类型(Duck Typing)应用广泛。典型的比如Iterable,JavaScript中的迭代并不要求像C++要求实例必须继承自某个父类,或像Java要求实例必须实现某个Interface,JavaScript中的Iterable只需要检查当前对象是否实现了@@iterator
方法。
集合与类型
TypeScript只检查类型定义的约束条件,这一点与集合(Set)的概念颇为相似。
类型推导
类型收缩(Type Narrowing)
类型编程
TypeScript不可对各种各类型进行类似集合一样的操作,还可以进行类型层面的编程。
泛型(Generics)
- 主流开发语言通常会支持泛型以提供更加出色的抽象能力
- 本质上泛型可视为一个类型层面的函数
- 定义泛型时只需要定义逻辑处理过程,只有在用到具体输入类型调用时,才会得到真正的结构类型。
TypeScript的泛型是在类型空间编程(类型编程)
片段(Partial)
条件类型(Conditional Type)
- 条件类型用来表述非单一形式的类型
递归
图灵完备(Turing Complete)
TypeScript是图灵完备的,它完全有能力完成任何类型层面的可计算问题。
TypeScript包含了一套完整的类型层面编程的能力
TypeScript解决各种类型问题,本质上他们的内核都是和图灵机等价。
类型保护
JavaScript中同构判断来处理逻辑,而在TypeScript中判断的条件语句还有另外一个特性,即根据判断逻辑的结果来缩小类型范围,这种特性又称为类型保护。
类型保护触发条件
- 逻辑条件语句块:
if
、else
、elseif
- 特定关键字:
typeof
、instanceof
、in
...