这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战
交叉类型
交叉类型由两个或者多个成员类型构成,每个成员之间用&分割。交叉类型中可以存在多个相同的成员类型。交叉类型也可以和对象类型一起使用。
type X = number & string & boolean
交叉类型可以使两个接口类型有合并效果。如果两个接口类型中的参数不同,就会相当于合并所有参数,如果两个接口参数相同,合并后相当于去除重复的。即使两个接口存在可选属性也是可以合并的。如果交叉类型中存在索引签名那么合并后也有索引签名,如果交叉类型的成员中没有索引签名,那么合并后也没有索引签名。如果索引签名不一致,那么合并后会拥有不同的索引签名,如果索引签名一致,但是成员类型不一致,那么显示同一个索引签名,后面是成员类型的合并,每个成员之间用&进行连接。交叉类型中含有的调用签名或者构造签名在合并到交叉类型时,有先后顺序,谁在前面谁的成员也在前面。
interface Z {
a: string;
b: number
}
interface X {
a: string;
d: number
}
// 和上面两个分开写的等价
{
a: string;
b: number;
d: number;
}
交叉类型中&符号优先级是高于联合类型中的|符号,&符号相当于数学中的X,而|符号相当于数学中的+号。我们可以使用分组运算符()去指定优先级。&符号和|符号的优先级高于函数类型字面量,在它们同时使用的时候。≡符号表示恒等的意思。而且交叉类型还可以像使用数学中的乘法分配律一样进行分配。
索引类型
索引类型的关键字是keyof,后面跟着任意一种类型。索引类查询的结果可以是联合类型。我们需要注意的是如果对象类型中包含属性名为symbol属性,那么属性名必须为unique symbol而不能为symbol类型。如果对any进行索引查询那么类型为联合类型。如果对unknown类型使用索引查询,那么类型为never类型。原始类型中使用索引类型时,会先查询原始类型的内置对象类型再进行索引类型的查询。如果是原始类型boolean类型去执行索引类型,那么结果会输出为字符串valueOf字面量类型。
type KeyofT = keyof any;
type KeyofT = keyof unknown;
type KeyofT = keyof boolean;