TypeScript中Map如何正确定义嵌套泛型类型
报错原因
- 给泛型接口传参时不需要写
T=这类参数名赋值语法,直接按泛型定义的顺序传入类型值即可 - Map声明的value类型需要和后续存入的元素类型兼容,同时初始化Map时的泛型参数要和声明保持一致
正确实现
场景1:Map仅存储固定泛型参数的MainPart(T为number、T1为string)
如果你的业务场景中所有存入Map的MainPart都使用固定的泛型参数,直接修正泛型传参语法即可:
export interface Part0 <T = number> { partsInLib : T; } export interface Part1 <T = string> { desc : T; } export interface MainPart <T = number, T1 = string> { component?: Part0 <T>; anotherComponent?: Part1 <T1>; count: number; } // 修正泛型传参语法 let mapObj : Map<string, MainPart<number, string>>; mapObj = new Map<string, MainPart<number, string>>();
注意:该场景下processMainPart生成的动态泛型MainPart<T,T2>无法直接存入Map,会触发类型不匹配报错。
场景2:Map支持存储任意泛型参数的MainPart
如果需要兼容processMainPart传入的动态泛型参数,将Map的value类型定义为接收任意类型的MainPart即可:
export interface Part0 <T = number> { partsInLib : T; } export interface Part1 <T = string> { desc : T; } export interface MainPart <T = number, T1 = string> { component?: Part0 <T>; anotherComponent?: Part1 <T1>; count: number; } // 定义value为任意泛型的MainPart let mapObj : Map<string, MainPart<unknown, unknown>>; mapObj = new Map<string, MainPart<unknown, unknown>>(); function processMainPart<T = number, T2=string>(incomingPart1 : Part1<T2>){ let mp : MainPart<T,T2> = { anotherComponent: incomingPart1, count: 0 } mapObj.set( "a1", mp); }
如果你不需要严格的类型校验,也可以把unknown替换为any使用。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

