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

如何在TypeScript接口中使用对象的键作为属性允许值?

解决方法

直接使用keyof typeof foo即可,因为keyof操作符仅能作用于类型,而foo是运行时的值,typeof foo会获取该值对应的类型,再通过keyof提取它的键类型。

完整代码示例

const foo = {
    "bar": "a",
    "foobar": "b"
}

interface SomeInterface {
    a: keyof typeof foo; // 允许取值为 "bar" | "foobar"
}

// 测试验证
const validObj: SomeInterface = { a: "bar" }; // 合法
const invalidObj: SomeInterface = { a: "other" }; // 报错:类型'"other"'不能赋值给类型'"bar" | "foobar"'

更严谨的写法(可选)

如果希望TypeScript将foo的键严格推断为字面量类型(避免后续修改对象时类型被拓宽),可以给对象添加as const断言:

const foo = {
    "bar": "a",
    "foobar": "b"
} as const;

interface SomeInterface {
    a: keyof typeof foo;
}

错误原因说明

你之前的写法keyof foo报错,是因为foo是一个运行时存在的值,而keyof是TypeScript的类型系统操作符,只能用于类型层面的操作,不能直接作用于值。typeof foo的作用是把值foo转换为它对应的TypeScript类型,这样keyof就能正常提取该类型的键了。

内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:12:41