You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:24:54