为什么TypeScript非泛型映射类型的-?修饰符无法移除属性的undefined类型?
TypeScript 映射类型
-? 修饰符泛型与非泛型场景行为差异原因 先纠正对
-?修饰符的认知误区-?的唯一作用是移除映射类型中属性的可选修饰符,不会修改属性本身的类型定义,也不会主动删除属性类型中的undefined联合类型。非泛型场景 T1 结果符合预期
你定义的Item类型所有属性本身就是必选属性,b的undefined是类型的联合成员,不是可选修饰符带来的隐含类型。非泛型映射{ [P in keyof Item]-?: Item[P] }执行时没有可选修饰符可移除,所有属性类型完全保留,最终b的类型还是number | undefined。泛型场景 T2 自动剔除
undefined的原因
泛型形式的映射类型{ [P in keyof U]-?: U[P] }属于 TypeScript 的同态映射类型,这类映射仅作用于输入泛型参数的自有属性,不会引入新属性。当你传入已定义的Item类型时,会触发 TS 隐含的类型优化规则:如果生成的是必选属性,TS 会自动将属性类型中冗余的undefined联合成员剔除,这个效果是同态映射的特性带来的,和-?本身没有直接关系。验证示例
你可以修改Item定义验证上述逻辑:
// 将b改为可选属性,可选属性的类型会隐含包含undefined type Item = { a: string, b?: number, c: boolean }; // 此时非泛型的-?会移除b的可选修饰符,同时剔除可选属性自带的undefined type T1 = { [P in keyof Item]-?: Item[P] }; // 类型为 { a: string, b: number, c: boolean }
该示例证明 -? 本身在非泛型场景下也能正常工作,你观察到的差异本质是是否触发了同态映射的隐含优化规则。
内容的提问来源于stack exchange,提问作者Moon
相关产品推荐
相关产品推荐

