TypeScript类型运算符优先级是怎样的?是否有完整优先级对照表?
TypeScript 类型运算符优先级说明
目前TypeScript官方未发布公开的完整类型运算符优先级官方文档,不过社区通过实测、校验TypeScript编译器源码已经整理出了经过验证的优先级排序,从高到低如下:
- 第1级(最高优先级):括号
(),可强制优先计算括号内的类型逻辑,优先级高于所有运算符 - 第2级:单目类型运算符,包括
keyof、typeof、readonly(数组/元组前缀修饰)、正负修饰符+readonly/-readonly、+?/-?对应你提到的示例:
typeof map[T]中typeof优先级高于索引访问,所以实际等价于(typeof map)[T],而非直觉上的typeof (map[T]) - 第3级:索引访问
T[K] - 第4级:映射类型遍历声明
[K in Type] - 第5级:函数/构造函数类型声明的参数定义部分
- 第6级:函数类型返回值箭头
=>,右结合 - 第7级:条件类型关键字
extends、配套的infer关键字(infer仅可在extends右侧子句使用,作用域跟随所属extends子句),条件类型整体为右结合示例:
A extends B ? C extends D ? E : F : G等价于A extends B ? (C extends D ? E : F) : G - 第8级(最低优先级):联合类型
|、交叉类型&,其中交叉类型&优先级高于联合类型|
如果编写复杂类型时对优先级没有把握,直接添加括号明确运算顺序是最稳妥的方案,不会产生额外的运行时开销,也能避免类型计算结果不符合预期。
内容的提问来源于stack exchange,提问作者Guerric P
相关产品推荐
相关产品推荐

