如何基于已有对象定义强类型,确保键值与键名严格对应?
解决方案:创建键值严格匹配的类型
要实现键必须来自First的键,且每个键的取值与键名完全一致的类型约束,Record类型确实无法满足(它只能统一约束值类型,没法针对每个键指定专属的匹配值),可以通过映射类型结合字面量类型捕获来实现:
步骤1:确保First的键被精确捕获(可选,若First已为字面量类型可跳过)
如果你的First对象没有用as const断言,TypeScript会自动拓宽其键的类型为string,所以先添加断言让TS精确识别每个键:
const First = { john: "whatever", doe: "whatever-whatever", Fulan: "whatever-whatever-whatever" } as const;
步骤2:定义myStrongType类型
使用映射类型遍历First的每个键K,强制每个键的值必须等于键名本身(即类型为K):
type myStrongType = { [K in keyof typeof First]: K; };
验证示例
- 符合要求的对象(无类型错误):
const Second: myStrongType = { john: "john", doe: "doe", Fulan: "Fulan" };
- 不符合要求的对象(TS会自动检测键值不匹配的错误):
const Third: myStrongType = { john: "john", doe: "wrong-value", // 此处报错:类型"wrong-value"不能赋值给类型"doe" Fulan: "Fulan" };
补充说明
- 映射类型
[K in keyof typeof First]: K会为每个键K单独指定值类型为K(即键名的字面量类型),从而实现键值的严格匹配。 - 如果无法修改原
First对象的定义,可以先提取键类型再创建映射:
type FirstKeys = keyof typeof First; type myStrongType = { [K in FirstKeys]: K };
内容的提问来源于stack exchange,提问作者Marquis
相关产品推荐
相关产品推荐

