如何让TypeScript中Record的值与键严格匹配?
问题:如何让Record的值与对应键严格匹配?
我定义了如下User接口及对应的Record类型代码:
interface User { email: string; name: string; } const UserRecord: Record<keyof User, keyof User> = { email: 'email', name: 'name', };
但这段代码的值部分没有类型安全性,比如我可以写出不符合预期的代码:
const UserRecord: Record<keyof User, keyof User> = { email: 'name', name: 'email', };
请问如何实现让Record的值与对应的键严格匹配?
解决方案
不要用Record类型,改用映射类型约束每个键的值必须和键本身完全一致。具体实现如下:
interface User { email: string; name: string; } // 定义映射类型,每个键 K 的值类型限定为 K 本身 type KeyMirror<T> = { [K in keyof T]: K; }; // 使用该类型声明 UserRecord const UserRecord: KeyMirror<User> = { email: 'email', name: 'name', };
这样如果尝试给email赋值'name',TypeScript会直接抛出类型错误,确保每个键的值和键严格匹配。
如果想要更简洁的写法,也可以直接在声明时使用映射类型,无需单独定义KeyMirror:
const UserRecord: { [K in keyof User]: K } = { email: 'email', name: 'name', };
这种方式的核心是利用TypeScript映射类型特性,为每个键单独指定值类型为键的字面量类型,避免了Record让所有键共享同一值类型的问题。
内容的提问来源于stack exchange,提问作者meightythree
相关产品推荐
相关产品推荐

