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

TypeScript:如何从对象类型推断属性对应的具体值类型?

解决TypeScript中[属性, 值]元组的类型自动推断问题

你原来的DoubleTuple类型存在核心问题:infer P会把P推断为对象所有属性名的联合类型,对应的T[P]就变成了所有值类型的联合,导致不管输入哪个属性,值都允许number | string,完全失去了类型校验的意义。


正确的元组联合类型定义

我们需要为对象的每个属性单独生成对应的[属性名, 属性值类型]元组,再把这些元组组成联合类型,这样TypeScript就能根据属性名自动锁定对应的值类型:

type DoubleTuple<T> = { [K in keyof T]: [K, T[K]] }[keyof T];

interface ExampleModel {
  a: number;
  b: string;
}

// 合法:属性'a'对应值类型number
const tuple1: DoubleTuple<ExampleModel> = ["a", 3];
// 报错:属性'a'不允许字符串值(TypeScript会提示类型不匹配)
const tuple2: DoubleTuple<ExampleModel> = ["a", "3"];
// 合法:属性'b'对应值类型string
const tuple3: DoubleTuple<ExampleModel> = ["b", "3"];

更便捷的函数辅助推断

如果不想每次都显式指定DoubleTuple<ExampleModel>,可以写一个辅助函数让TypeScript自动完成类型推断:

interface ExampleModel {
  a: number;
  b: string;
}

function createTuple<T, K extends keyof T>(key: K, value: T[K]): [K, T[K]] {
  return [key, value];
}

// 自动推断出tuple的类型为["a", number]
const tuple = createTuple<ExampleModel>("a", 3);
// 报错:类型'"3"'不能赋值给类型'number'
const wrongTuple = createTuple<ExampleModel>("a", "3");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:53:20