TypeScript:keyof操作符处理可选属性为何返回含undefined的类型?
为什么TypeScript中你的类型B会是"x" | undefined?
首先明确:keyof A本身的结果只是"x",并没有包含undefined。问题出在你后续的映射类型和索引访问的组合逻辑上,拆解你的代码就能明白:
- 定义
type A = {x?: string | null};,这里x是可选属性。 keyof A的结果是"x"——TypeScript中keyof只会返回类型的所有显式声明键,不管属性是否可选,不会自动加入undefined。- 接下来的映射类型
{[Key in keyof A]: Key},因为原属性x是可选的,映射后的属性会保留可选性,最终这个类型等价于{x?: "x"}。 - 最后用
[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
相关产品推荐
相关产品推荐

