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

为何Record<keyof T, string>调用Object.values后返回unknown[]类型?

为什么Object.values返回unknown[]?

核心原因

  • TypeScript里Object.values的类型签名有两种:
    1. 接收键为string或类数组的对象,返回对应值类型的数组;
    2. 接收任意对象,返回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[]类型,可以通过以下方式处理:

  1. 限制泛型T的键类型为string/number:
function someMethod<T extends Record<string | number, unknown>>(map: Record<keyof T, string>) {
  const values = Object.values(map); // 类型为string[]
}
  1. 显式类型断言(确定不会有symbol键时使用):
function someMethod<T>(map: Record<keyof T, string>) {
  const values = Object.values(map) as string[];
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:50:11