为何Record<keyof T, string>调用Object.values后返回unknown[]类型?
为什么
Object.values返回unknown[]? 核心原因
- TypeScript里
Object.values的类型签名有两种:- 接收键为
string或类数组的对象,返回对应值类型的数组; - 接收任意对象,返回
unknown[](旧版本为any[])。
- 接收键为
- 你的代码中,
map的类型是Record<keyof T, string>,而keyof T的范围可能包含symbol(TypeScript允许对象键为string、number、symbol)。由于泛型T没有明确限制,TypeScript必须考虑keyof T包含symbol的情况,此时map不符合第一个签名的要求,只能匹配第二个签名,因此返回unknown[]。 - 泛型
T的不确定性也会影响推断:TypeScript无法提前确定T的具体结构,哪怕用Record约束了值类型,只要keyof T的范围超出string/number,就无法触发更精确的类型推断。
解决方法
如果希望values得到string[]类型,可以通过以下方式处理:
- 限制泛型
T的键类型为string/number:
function someMethod<T extends Record<string | number, unknown>>(map: Record<keyof T, string>) { const values = Object.values(map); // 类型为string[] }
- 显式类型断言(确定不会有symbol键时使用):
function someMethod<T>(map: Record<keyof T, string>) { const values = Object.values(map) as string[]; }
内容的提问来源于stack exchange,提问作者ablaszkiewicz1
相关产品推荐
相关产品推荐

