如何在TypeScript中从const衍生的Record类型排除指定键
TypeScript:创建排除指定枚举值的必填键Record类型
原始代码(OpenAPI生成)
export const MyConst = { A: 'a', B: 'b', C: 'c', } as const; export type MyConst = (typeof MyConst)[keyof typeof MyConst];
需求与问题
想要基于MyConst的值创建一个Record,要求:
'a'和'b'为必填键- 不允许包含
'c'键
最初直接使用Record<MyConst, string>会报错,因为缺少'c'键:
const mapper: Record<MyConst, string> = { [MyConst.A]: 'Test A', [MyConst.B]: 'Test B', };
错误提示:Record类型中缺少'c'键
改用Partial<Record<MyConst, string>>可以规避错误,但会让所有键变为可选,不符合必填要求:
const mapperWithPartial: Partial<Record<MyConst, string>> = { [MyConst.A]: 'Test A', [MyConst.B]: 'Test B', };
解决方案
可以通过Exclude工具类型从MyConst类型中排除'c'值,直接构造符合要求的Record类型:
const mapper: Record<Exclude<MyConst, typeof MyConst.C>, string> = { [MyConst.A]: 'Test A', [MyConst.B]: 'Test B', };
或者先定义排除后的类型再使用:
// 排除MyConst中的C键对应的类型 type MyConstAllowed = Exclude<MyConst, typeof MyConst.C>; const mapper: Record<MyConstAllowed, string> = { [MyConst.A]: 'Test A', [MyConst.B]: 'Test B', };
这样定义的mapper会强制要求包含'a'和'b'键,同时不允许添加'c'键,完全符合需求。
内容的提问来源于stack exchange,提问作者Croviajo
相关产品推荐
相关产品推荐

