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

如何基于已有对象定义强类型,确保键值与键名严格对应?

解决方案:创建键值严格匹配的类型

要实现键必须来自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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:55:21