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

TypeScript:keyof操作符处理可选属性为何返回含undefined的类型?

为什么TypeScript中你的类型B会是"x" | undefined?

首先明确:keyof A本身的结果只是"x",并没有包含undefined。问题出在你后续的映射类型和索引访问的组合逻辑上,拆解你的代码就能明白:

  1. 定义type A = {x?: string | null};,这里x是可选属性。
  2. keyof A的结果是"x"——TypeScript中keyof只会返回类型的所有显式声明键,不管属性是否可选,不会自动加入undefined。
  3. 接下来的映射类型{[Key in keyof A]: Key},因为原属性x是可选的,映射后的属性会保留可选性,最终这个类型等价于{x?: "x"}。
  4. 最后用[keyof A](也就是"x")索引这个映射后的类型时,根据TypeScript规则:访问可选属性的类型时,结果会自动包含undefined(可选属性意味着该键可能不存在,对应的属性值自然可能是undefined)。所以{x?: "x"}["x"]的结果就是"x" | undefined,这就是类型B的最终结果。

如果想得到纯"x",可以在映射时移除可选性,比如用-?:修饰符:

type A = {x?: string | null};
type B = {[Key in keyof A]-?: Key}[keyof A]; // 结果为"x"

或者用你提到的Required工具类型,本质也是移除所有属性的可选性:

type A = {x?: string | null};
type B = {[Key in keyof Required<A>]: Key}[keyof Required<A>]; // 结果为"x"

核心逻辑总结:

  • keyof不会引入undefined,它只返回类型的显式键。
  • 可选属性的索引访问会自动追加undefined,因为属性可能不存在。
  • 映射类型默认会保留原属性的可选性,这才是导致最终结果包含undefined的关键环节。

内容的提问来源于stack exchange,提问作者eugenedrvnk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:40:07