该索引对应 TypeScript 版本:4.4
官方 wiki 见https://www.typescriptlang.org/docs/handbook/release-notes/overview.html
增强的OOP
- 属性访问权限:
public
、private
和protected
(含直接在构造器参数中设定访问权限并初始化属性的语法糖 )。对构造器方法也适用。其中private
与ES标准提供的#
语法存在一定区别 - 设置只读属性。包括直接在构造器参数中设定只读的语法糖
- 抽象类和抽象方法:
abstract
- 类的可选属性和方法
- 接口(
interface
)- 供类实现(
implement
)。注意:对实现接口的类,类型检查将被施加在类的实例上而不是类上。这使得若要约束类的构造器,需要额外定义构造器接口(newable 函数 ) - 可以继承其它接口或继承其它类(使用
extends
关键字)
- 供类实现(
类型系统
通过尽可能地施加约束, 在编译期发现进行检查,从而尽量避免运行时错误。TS 中所有的类型约束检查均不是靠在编译得到的 JS 代码里加入运行时类型检查代码而进行的
-
类型系统可用于约束任何值(以变量或字面量的形式均可)。值得说明的包括:
- 函数
- 约束其参数和返回值(包括可选参数、默认参数以及剩余参数)
- 约束其
this
- 支持重载声明(overload,不是 override),但不支持重载实现
- 类
- 接口
- 函数
-
可供使用的类型:
- 内置的类型
- JS 的原始数据类型。其中null和undefined类型见此处的详细说明
- void、any(“类型系统你不要检查了!反正全是等价的”)、never(“反正这个值按理来说是不可能被 reach 的,就叫它 never 类型吧,并让它不与其它任何类型等价。如果该值被类型系统拿去比较了(必不匹配),说明逻辑有错”)、unkonwn(“我此时不清楚值的具体类型,但我在之后会看情况钦点(断言)一个。类型系统仍然要检查其合法性”)
- unique symbol
- 枚举:用于(在编译期或运行时)定义带类型信息的常量 (常量值可自动获得/程序员手动指定) 。关键字
enum
- 数字枚举、字符串枚举、混合枚举
- constant member(symbol 在编译期即可得到值) 和 computed member(symbol 在运行时得到值)
const enum
:symbol 仅存在于编译期(因此不能包含 computed member)
- 一些预置的 utility types(。让程序员进行类型操作,利用泛型机制得到新类型
- 自定义类型
- literal types:任一能在编译期得到值的字符串/数字/布尔值/对象/数组的字面量(表示一个值域有且仅有一个值的类型)
- Template Literal Types:可以用模版字符串的语法生成 string literl types(用法示例)
- typed array、typed tuple(支持可选的成员、剩余成员(未必要在尾部))。它们都可以使用
readonly
修饰符。typed tuple 还支持为成员加 label - class
- interface:描述数据应有结构(shape)。两种定义方式:使用
interface
关键字声明语法、使用 inline 语法- 对象的 shape:
- Excess Property Checks (该约束只对对象字面量有效,即 strict object literal checking )
- 可选属性 (
?:
) (全是可选属性的接口是一个weak type。该种类型的属性不能被全部遗漏) - 只读属性 (
readOnly
) - 索引属性 (
[index:]
)( 用于约束属性名和属性值,其中属性名支持 number / string / symbol 类型。 可用于规避 Excess Property Checks。index
可以换成任何你喜欢的字样)。一个 interface 中可有多个索引属性
- 函数的 shape: 包括 newable 函数、抽象构造函数。 支持约束可选参数、剩余参数(其中剩余参数支持使用 typed tuple 作类型,并且tuple 中还可以有泛型 );支持约束
this
- 混合的 shape(用于约束一个可调用对象)
- 声明接口时,可以重复声明同一个接口,TS 会合并其中重复的规则
- 对象的 shape:
- 函数签名(callable类型):允许脱离具体的函数的声明或表达式来定义一个函数签名。通常用于为函数变量、高阶函数的(函数)参数等施加类型检查
- Polymorphic
this
types: 用于一个父类方法,用关键字this
表示其任意子类型 - 经类型运算得到的类型
- Union types(
|
):多个类型取“或”关系。补充:- 一个技巧是连接多个字符串字面量或数字字面量,组成一个可取值集合以作为一个类型
- 如果被连接的多个类型**都具有一个同名的成员,且在各类型中,满足:未被指定为一个泛型类型,且至少在一个类型中被指定为 literal type**(各类型的该成员的类型不必都一样),则自动构成 Discriminated Unions (此时该成员称为 tag ) 。在使用 discriminated unions 时,TS 编译期会实施 Exhaustiveness checking(这是一个 type gurad特性。见下文),以检查使用它的代码是否处理了所有的 type(示例)。对于 tag,TS 会试图将被连接的多个类型中的 tag 组成一个 union type
- Intersection Types(
&
):多个类型取“且”关系 - index type query operator(关键字
keyof
):常接一泛型类型参数。keyof T
is the union of known, public property names(string、number or symbol) ofT
。对于 intersection type,有keyof (A & B)
等价于keyof A | keyof B
- indexed access operator(
T[K]
,其中T是一个类型名,K是T的一个字段名) : 常接泛型类型参数。得到类型T的字段K的类型。实例:该文章中”巧用查找类型“一节 - type query(关键字
typeof
): A type query obtains the type of an identifier or property access expression (that is, multiple identifiers connected by dots) - mapped types(关键字
in
):根据一个已有的类型(可以且通常是泛型)映射得到一个新类型。可映射名字的类型为string、number 或 symbol 类型 的属性。对于 typed array 和 typed tuple,只能映射它们的数字属性。做映射时可以使用+
和-
为映射后的类型上的成员添加/去除修饰符(例如readonly
、?
等),其中readonly
也能在给 typed array 和 typed couple 做映射时使用。映射时,可以使用as
关键字将欲映射的类型先映射一次(也就是说,总的来说你可以映射两次) - conditional types:用来表述非单一形式的类型。A conditional type selects one of two possible types(
X
、Y
) based on a condition expressed as a type relationship test(形如T extends U ? X : Y
), either resolved toX
orY
, or deferred until type system has enough information to conclude thatT
is always assignable toU
。一个具体例子可见这篇文章中的“条件类型”一节- 如果
T
是个 Union Type,则会被展开( distributed ) infer
keyword says to TypeScript: “I want to take whatever TypeScript infers to be at this position and assign it to a name”。仅能用于extends
子句中- 支持递归
- 如果
- Union types(
- 由type alias(关键字
type
)定义的类型。该功能用于为类型取别名(尤其是经类型运算得来的类型)。别名不能用来 implement 或 extends。可以递归定义
- 内置的类型
-
class, interface, enum, 和 type alias 的作用域最小可以是块级
-
类型之间有兼容关系。兼容的两个类型不受类型约束的限制。TS 大体上采用的是”结构等价“的类型兼容性判断策略
- 接口间的兼容: The basic rule for TypeScript’s structural type system is that x is compatible with
y
ify
has at least the same members asx
。若想采用”名字等价“的类型兼容性判断策略,workaround 见此处 - 函数类型之间的兼容
- 枚举与Number之间的兼容
- 无继承关系的类与类之间的兼容
- 使用了泛型时的兼容规则
- tuple 类型与 tuple 类型之间的兼容
- 存在 subtype 或 extends 关系的类型之间
- 接口间的兼容: The basic rule for TypeScript’s structural type system is that x is compatible with
-
程序员钦点类型的方法
-
类型断言(
as
),允许程序员指定编译器在编译期将任何值(可以是变量或者字面量)钦点为某个指定类型,以覆盖 TS 类型推断的得到的类型或此前程序员指定的类型(一旦这么做,类型安全就需要由程序员自己加以保证了)。该功能不是在运行时发生的 type casting。 Basically, the assertion from type S to T succeeds if either S is a subtype of T or T is a subtype of S。亦可凭空(即不基于 subtype 关系)进行类型断言,但不建议这么做。类型断言的其它形式包括:- Non-null assertion operator(
!
):它断言其左边的值不会是 null 或 undefined - Definite Assignment Assertions(
!
):对一个变量使用,可以告诉 TypeScript 它的值的类型一定不会是 null 或 undefined - 对字面量值可使用
as const
进行断言,断言为一个 literal type。对对象字面量,其上所有成员 readonly;对数组字面量,断言得到 readonly tuple
- Non-null assertion operator(
-
利用控制流来收窄类型(比类型断言更灵活)
-
type predicate(
is
):利用 user-defined type guards function 进行类型保证,支持对this
使用(即this is ...
)。 TS 编译器把该类函数被调用且返回值为 true 的代码块内,被传给该类函数的变量的类型一律视为is
指定的结果。该语言特性可用来消除一段代码内反复出现的对同一类型的断言 -
assert function:利用 assert function 进行类型保证。 TS 编译器把位于该类函数被调用的位置之后,被传给该类函数的变量的类型视为
assert...is
指定的结果;或是把作为 a sserts condition 的表达式(使用了 J S 运算符typeof
/instanceof
/in
)中得到的类型信息作为随后的类型。该功能是个升级版的 type predicate -
type guard,基于控制流中某些语句——例如搭配了 type narrowing(指“ 对 assert function 的调用、使用 JS 运算符
typeof
/instanceof
/in
或使用了 Discriminated Unions 中的 tag(见上文)以及 type predicate的情况) 的if...else
、return
、break
语句以及使用了?:
运算符的表达式语句,自动推断出类型- 支持 non-null check
- 支持 [dotted names checking](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#dotted-names-in-type-guards
-
在解构时显式标明无用变量,避免 noUnused 报错
-
-
-
TS 支持类型推断,在程序员没有手动指定类型的地方,编译器尽量根据上下文类型自动指定一个类型以用于静态类型检查(注意:必须熟悉 TS 的类型推断规则。由 TS 自动推断出的、并用于实施约束的类型很可能和程序员的预料不一样。别无他法时,可使用类型断言来覆盖类型推断的结果)
-
TS 支持在函数、接口以及类(包括 JSX 表示的元素字面量)上使用泛型类型 (其中对函数允许用泛型类型约束剩余参数) 。泛型类型是参数化的类型。被使用泛型类型所约束的东西在使用时可以为类型参数指定具体类型(即显式指定泛型参数),否则将依赖 TS 的类型推导确定类型参数的具体类型
- 支持多个类型参数,它们之间可以构成约束关系
- 可令类型参数与类或接口构成约束(使用
extends
关键字)。可以 extends any 类型 - 类型参数可以有默认值。当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用
- 如何对工厂函数应用泛型
其它
- .d.ts 文件
- 模块路径确定策略