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

TypeScript中如何返回含指定键的类型化对象?

TypeScript实现返回带特定编译时常量键的类型化对象

完全可行,根据你是否需要运行时对象的键与编译时指定的一致,有两种实现方式:

方式一:通过字面量参数推导泛型(运行时+编译时都正确)

这种方式通过传入字符串字面量参数,让TypeScript自动推导泛型类型,同时保证运行时对象的键与编译时指定的一致:

function addNumber<Key extends string>(key: Key): Record<Key, number> {
  return { [key]: 5 } as const satisfies Record<Key, number>;
}

const a = addNumber('x');
a.x; // 类型为number,编译正常
a.y; // 编译错误:属性'y'不存在于类型'{ x: number; }'上

这里Record<Key, number>明确了返回类型,as const satisfies确保返回的对象字面量符合该类型,避免类型拓宽。调用时传入的'x'是编译时常量,TypeScript会将Key推导为'x',从而让返回对象的类型被精确约束。

方式二:仅通过泛型指定键(仅编译时类型正确)

如果你完全不需要运行时的键值正确,只要求编译时类型检查生效,可以通过泛型指定键,但需注意泛型类型在运行时会被擦除,运行时对象的键只能用占位符:

function addNumber<Key extends string>(): Record<Key, number> {
  // 泛型Key仅存在于编译阶段,运行时无对应值,因此用占位符+类型断言
  return { ['__placeholder__' as Key]: 5 } as Record<Key, number>;
}

const b = addNumber<'x'>();
b.x; // 编译时类型为number,访问正常
b.y; // 编译错误:属性'y'不存在于类型'{ x: number; }'上

这种方式不需要传入运行时参数,完全通过泛型<Key>指定编译时的键,但运行时对象的实际键是占位符__placeholder__,仅适合不需要依赖运行时键值的场景。

注意

如果你的核心需求是运行时对象的键与编译时类型一致,优先选择方式一——因为TypeScript泛型是编译时特性,运行时会被擦除,方式二无法在运行时获取泛型对应的键值。

内容的提问来源于stack exchange,提问作者hopeless-programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:20:05