TypeScript如何实现约束对象键名与对应值为相同字符串类型?
解决方案
可以实现,不需要提前枚举所有可能的键名,通过泛型约束就能达到要求。
实现代码
// 核心约束类型:要求对象的每个属性值等于对应的属性名 type KeyValueSame<T> = { [K in keyof T]: K } // 辅助推导函数,无需手动声明泛型参数,TS会自动推导传入对象的类型 const defineKeyValueSame = <T extends KeyValueSame<T>>(obj: T) => obj
效果验证
// 合法示例,无类型报错 const valid1 = defineKeyValueSame({ foo: "foo" }) const valid2 = defineKeyValueSame({ bar: "bar" }) // 支持任意自定义键 const valid3 = defineKeyValueSame({ a: "a", b: "b", test: "test" }) // 非法示例,TS直接抛出错误 // 错误提示:不能将类型“"bar"”分配给类型“"foo"” const invalid = defineKeyValueSame({ foo: "bar" })
补充说明
如果是需要对函数参数做这类约束,可以直接把泛型写在函数定义里,不需要额外的辅助函数:
function processDict<T extends KeyValueSame<T>>(dict: T) { // 函数内部逻辑 } // 调用时自动校验参数合法性 processDict({ x: "x" }) // 合法 processDict({ x: "y" }) // 报错
内容的提问来源于stack exchange,提问作者Tomas Reimers
相关产品推荐
相关产品推荐

