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

如何用TypeScript创建键值类型匹配的Record并保留类型安全?

实现方法

你需要用**映射类型(Mapped Types)**替代普通的Record——因为Record<K, T>要求所有键对应的值类型一致,无法满足每个键对应不同类型的需求,而映射类型既能为每个键指定单独的类型,又能强制包含所有Level的键。

步骤1:定义层级与类型的映射关系

先创建一个类型,把每个Level值精准映射到对应的对象类型:

type LevelToType = {
  intro: TypeA;
  main: TypeB;
  outro: TypeC;
};

步骤2:添加编译时完整性检查(可选)

为了确保上述映射完全覆盖Level的所有键,可以加一个类型约束,编译阶段就能检测是否遗漏:

// 约束LevelToType的键必须完全覆盖Level
type EnsureAllLevelsCovered = Exclude<Level, keyof LevelToType> extends never ? true : false;
// 若遗漏Level中的键,下面的常量声明会直接报错
const _check: EnsureAllLevelsCovered = true;

步骤3:创建符合要求的record对象

直接用LevelToType作为record的类型即可,它既强制包含所有Level的键,又能让每个键对应正确的类型,同时支持完整的IntelliSense:

const record: LevelToType = {
  intro: { textA: "入门文本" },
  main: { textB: "核心文本" },
  outro: { textC: "结尾文本" },
};

效果验证

此时访问record.intro.会只提示textA,record.main.只提示textB,完全匹配你的需求;如果遗漏了某个Level的键,TypeScript会直接抛出编译错误,保证结构完整性。

为什么不用Record?

Record<Level, T>的设计目标是所有键对应相同的T类型,无法实现“每个键对应不同类型”的场景。而LevelToType本质是索引类型,它的键完全覆盖Level的所有值,且每个键有独立的类型,完美适配你的需求。

内容的提问来源于stack exchange,提问作者Harald Schroeder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:57:07