如何用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
相关产品推荐
相关产品推荐

