# TypeScript

# TypeScript的设计目标

  • TypeScript是一种在编译期进行静态类型分析的强类型语言。拥有一个语言服务层为开发者提供更好的工具。
  • JavaScript兼容。TypeScriptJavaScript的超集,任何合法的JavaScript程序都是合法的TypeScript程序。
  • 给大型项目提供一个构建机制,加入了基于类Class的对象、接口和模块。
  • 对于发行版本代码,没有运行时开销。TypeScript程序通常将设计阶段运行阶段分开。TypeScript的新特性仅对设计时代码design time code有效,而对于执行时代码excution time code则通过代码转换(转换为JavaScript代码)和类型擦除将之转换为纯净的JavaScript代码。
  • 遵循当前以及未来的ECMAScript规范。
  • 开源。

# TypeScript的类型系统

TypeScriptJavaScript增加了可选的静态类型说明,用以约束函数、变量、属性等程序实体。以便编译器和相应的开发工具可以在开发过程中提供更好的正确性校验和帮助提示。

可选的静态类型声明optional static type notation在变量的后面并且以冒号分隔:

var counter                 // 未知(any)类型
var counter = 0             // number类型,类型推导type inference
var counter : number        // number类型
var counter : number = 0    // number类型
1
2
3
4

# JS基本类型

JavaScript的基本类型在TypeScript中都有对应的类型:

  • number
  • string
  • boolean
  • symbol,是ES6新增的数据类型,在编译目标是ES5及以下时会报错。由于只能通过Symbol函数生成,可以通过类型推断确定类型,无需特别声明变量为symbol类型。
  • undefinednull,是所有其他类型的子类型,可以赋值给任何其他类型的变量。在tsconfig中开启了strictNullChecks,那么undefinednull就只能赋值给voidany类型变量以及它们自身类型的变量。

# Any类型

any类型,表示任何JavaScript值。any类型即是类型系统的顶级类型(全局超级类型),又是bottom type(任何类型的subtype),是类型系统的一个逃逸舱。

可以将在编程阶段还不清楚类型的变量指定为any类型。另外,any类型是与现有代码一起工作时的一种高效的方式。any类型也可以用于只知道一部分类型的情况,例如一个混合了各种类型的数据(Array<any>)。

# Unknown类型

TypeScript3.0引入的另一种顶级类型。与any相比,unknown是类型安全的。任何值都可以赋给unknown类型,但是unknown类型在被类型断言或者基于控制流的类型细化之前,不能赋值给除了any类型和unknown类型本身以外的类型。

# Void类型

void类型与any类型相反,表示没有任何类型。当一个函数没有返回值时,其返回值类型是void

void类型只能被赋值为undefinednull

# Never类型

never用于表示永远不会存在的值的类型。never是任何类型的子类型,但没有类型是never的子类型。

never类型常用于以下情况:

  1. 用于描述从不会有返回值的函数或箭头函数
  2. 用于描述总是抛出错误的函数
  3. 当变量被永不为真的类型保护所约束时

# Object类型

object表示非原始类型,即除numberstringbooleansymbolnullundefined之外的类型。与any类似,可以在编译时可选择地包含或移除类型检查。但是object类型只允许被赋值为任意类型,但是不能够调用任意方法,即使它真的有这些方法。

let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
1
2
3
4
5

# TypeScript的编译原理

TypeScript编译器由以下几个部分组成:

  • Scanner扫描器
  • Parser解析器
  • Binder绑定器
  • Checker检查器
  • Emitter发射器