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
相关产品推荐
相关产品推荐

