TypeScript 类型运算
数据类型也是可以运算的
改变成员类型的顺序不影响联合类型的结果类型。
对部分类型成员使用分组运算符不影响联合类型的结果类型。
联合类型的成员类型可以进行化简。假设有联合类型“U = T0 | T1”,如果T1是T0的子类型,那么可以将类型成员T1从联合类型U中消去。最后,联合类型U的结果类型为“U = T0”。例如,有联合类型“boolean | true | false”。其中,true类型和false类型是boolean类型的子类型,因此可以将true类型和false类型从联合类型中消去。最终,联合类型“boolean | true | false”的结果类型为boolean类型。
&
的优先级高于|
。
分配律
一个稍微复杂的类型等式。
never 可以视为空集。
很适合在交叉类型中用作过滤。
范例:https://www.typescriptlang.org/play#example/conditional-types
在联合类型中,unknown吸收所有类型。这意味着如果任何组成类型是unknown,则联合类型的计算结果为unknown。
该规则的一个例外是any。如果至少有一种构成类型是any,则联合类型的计算结果为any:
在交叉类型中,每种类型都吸收unknown. 这意味着与任何类型相交unknown不会改变结果类型:
除非使用as
断言,首先缩小类型unknown
类型的范围,然后才可以用于其他类型。
如果类型是多个值的联合,甚至可以产生插值的效果。
如果交叉类型中存在多个相同的成员类型,那么相同的成员类型将被合并为单一成员类型。
上面示例中,T0、T1和T2都表示同一种类型boolean。
改变成员类型的顺序不影响交叉类型的结果类型。
注意,当交叉类型涉及调用签名重载或构造签名重载时便失去了“加法交换律”的性质。因为交叉类型中成员类型的顺序将决定重载签名的顺序,进而将影响重载签名的解析顺序。
此例第8行和第9行使用不同的成员类型顺序定义了两个交叉类型。第15行,调用“register()”方法的返回值类型为void,说明在ClickableAndFocusable类型中,Clickable接口中定义的“register()”方法具有更高的优先级。第16行,调用“register()”方法的返回值类型为boolean,说明FocusableAndFocusable类型中Focusable接口中定义的“register()”方法具有更高的优先级。此例也说明了调用签名重载的顺序与交叉类型中成员类型的定义顺序是一致的。
对部分类型成员使用分组运算符不影响交叉类型的结果类型。
上面示例的T0和T1类型是同一种类型。
只要交叉类型I中任意一个成员类型包含了属性签名M,那么交叉类型I也包含属性签名M。
若交叉类型的属性签名M在所有成员类型中都是可选属性,那么该属性签名在交叉类型中也是可选属性。否则,属性签名M是一个必选属性。