为何TypeScript无法识别Partial对象的Object.values可能包含undefined?
TypeScript中Object.values类型推导不符合预期的问题
先看这段代码:
const example: Partial<{ a: string }> = { a: undefined }; const value = example.a; // 类型为 string | undefined const values = Object.values(example); // 类型为 string[] (!?)
问题原因
这是TypeScript对Partial<T>和Object.values()的类型设计规则导致的:
Partial<T>的作用是把T的所有属性变为可选属性,在默认编译规则(未开启exactOptionalPropertyTypes)下,可选属性的语义是“该属性可能不存在”,而非“属性值可以是undefined”。Object.values()的类型推导逻辑默认会忽略可选属性的undefined情况,它假设可选属性要么存在且是对应类型的值,要么完全不存在,不会处理你手动给可选属性赋值undefined的场景,所以最终推导出的类型是string[]。
解决办法
- 开启
exactOptionalPropertyTypes编译选项:开启后,可选属性的类型会严格对应T | undefined,此时Object.values(example)的类型会正确推导为(string | undefined)[]。 - 显式定义包含undefined的属性类型:把对象类型改为
{ a?: string | undefined },这样Object.values就能识别到属性值可能是undefined,推导出正确的联合类型数组。
内容的提问来源于stack exchange,提问作者nullromo
相关产品推荐
相关产品推荐

