为何给keyof typeof Animals加括号会移除readonly索引签名?
枚举映射类型中括号的作用解释
首先定义如下枚举:
enum Animals { CAT, DOG, PARROT, SHEEP, SALMON }
两种映射类型的差异
无括号的映射类型
type AnimalsToMappedType = { [K in keyof typeof Animals]: K }
生成的类型会包含readonly [x: number]: number;索引签名,以及所有枚举成员对应的键值对。
带括号的映射类型
type AnimalsToMappedType = { [K in (keyof typeof Animals)]: K }
生成的类型仅保留枚举成员对应的键值对,原本的数字索引签名被移除。
括号的作用原理
这是TypeScript处理映射类型时的分布式与非分布式类型处理逻辑差异导致的:
- 无括号时,
keyof typeof Animals是包含字符串枚举键("CAT"、"DOG"等)和数字索引number的联合类型。映射类型会分布式遍历联合类型的每个成员,包括数字索引,因此最终保留了对应的索引签名。 - 加括号后,
(keyof typeof Animals)被包装成一个非分布式的单一类型整体。此时TypeScript会自动过滤掉联合类型中的索引签名(索引签名不属于可枚举的字面量类型成员),只对枚举的字符串键进行映射,所以最终结果里没有了数字索引签名。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

