如何定义Map的泛型参数,使其键对应值包含该键作为指定属性值
解决方案
你可以通过自定义泛型约束结合类型工具实现这个需求,这里提供两种常用的实现方案:
方案1:配合映射类型校验原始数据后生成Map
如果你的键值对是预先定义好的,推荐用satisfies操作符做前置校验,写法最简单:
// 定义原始数据,会自动校验每个键对应的specialKey与键相等 const rawData = { 'a': { specialKey: 'a', aField: 'specific thing to a' }, 'b': { specialKey: 'b', bField: 'specific thing to b' } } satisfies { [K in string]: { specialKey: K } }; // 直接转成Map即可 const map = new Map(Object.entries(rawData));
如果存在键和specialKey不匹配的情况,TypeScript会直接在rawData定义处抛出类型错误。
方案2:封装带类型约束的Map构造工具
如果你需要动态增删键值对,想要在调用set方法时也做自动校验,可以封装一个专用的Map创建函数:
// 定义带约束的Map类型 type SpecialKeyMap<K extends string> = Map<K, { specialKey: K } & Record<string, unknown>>; // 封装创建方法,自动推导键类型并做约束校验 function createSpecialKeyMap<const K extends string>( entries?: [K, { specialKey: K } & Record<string, unknown>][] ): SpecialKeyMap<K> { return new Map(entries); }
使用示例:
// 初始化时自动校验 const map = createSpecialKeyMap([ ['a', { specialKey: 'a', aField: 'xxx' }], ['b', { specialKey: 'b', bField: 'yyy' }] ]); // 调用set方法时也会自动校验 map.set('a', { specialKey: 'a', otherField: 'zzz' }); // 校验通过 map.set('a', { specialKey: 'c', otherField: 'xxx' }); // 类型报错,提示specialKey应该为a
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

