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

TypeScript如何通过类型推断自动定义对象的合法键而无需手动声明?

TypeScript自动推导对象嵌套键类型方案

你原写法的问题在于:手动给myObject标注了IMyObject类型,而IMyObject中将bucket1定义为Record<string, string>,类型直接被拓宽为「任意字符串为键、值为字符串的对象」,TS自然不会对键的合法性做校验。

方法1:使用satisfies操作符(TS 4.9+ 推荐)

TS 4.9新增的satisfies关键字刚好适配这个场景:它会校验值是否符合指定类型的结构,但不会把值的类型强制拓宽为指定类型,会完整保留值本身的精确类型信息。
示例代码:

interface IMyObject {
    bucket1: Record<string, string>;
}

const myObject = {
    bucket1: {
        itemA: "itemA",
        itemB: "itemB",
    },
} satisfies IMyObject;

// 访问不存在的键会直接报错:Property 'itemC' does not exist on type '{ itemA: string; itemB: string; }'
const itemC = myObject.bucket1.itemC;

方法2:泛型工具函数(兼容低版本TS)

如果你使用的TS版本低于4.9,可以自己写一个简单的泛型工具函数实现相同效果:

interface IMyObject {
    bucket1: Record<string, string>;
}

// 泛型工具:校验输入符合IMyObject结构,同时返回输入的精确类型
function createMyObject<T extends IMyObject>(obj: T) {
    return obj;
}

const myObject = createMyObject({
    bucket1: {
        itemA: "itemA",
        itemB: "itemB",
    },
});

// 同样会触发类型错误
const itemC = myObject.bucket1.itemC;

两种方案都不需要你手动枚举任何键,TS会自动从你写的对象字面量中提取所有已存在的键作为合法类型,访问不存在的键时就会抛出类型错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:09:05