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

