Typescript如何合并两种复杂泛型类型实现通用配置对象类型定义
统一类型定义
你可以通过映射类型重映射结合交叉类型合并两种结构,既能严格区分单字段配置和分组配置的类型,又能避免索引签名冲突问题,最终实现如下:
export interface RuleDetailFieldConfig { provider: string; validators: string[]; } // 合并后的通用配置类型 export type RuleDetailsUnifiedConfig<Type> = // 泛型关联键仅支持单字段配置 { [Property in keyof Type]: RuleDetailFieldConfig } // 非泛型自定义键仅支持分组配置 & { [GroupName in string as GroupName extends keyof Type ? never : GroupName]: Array<Partial<{ [Property in keyof Type]: RuleDetailFieldConfig }>> }
验证示例
代入你给出的Test接口测试,完全匹配myConfig的结构,可正常通过类型校验:
interface Test { keyA: any; keyB: any; keyC: any; keyD: any } const myConfig: RuleDetailsUnifiedConfig<Test> = { 'keyA': { provider: 'Country', validators: [] }, 'myGroup': [ { 'keyB': { provider: 'Country', validators: [] }, 'keyC': { provider: 'Country', validators: [] }, 'keyD': { provider: 'Country', validators: [] }, } ] };
类型约束说明
- 属于泛型
Type的键(示例中为keyA)只能赋值RuleDetailFieldConfig类型的单字段配置,赋值其他类型会抛出类型错误 - 不属于泛型
Type的自定义分组名(示例中为myGroup)只能赋值「泛型部分键对应字段配置的对象数组」,完全匹配你的分组需求
内容的提问来源于stack exchange,提问作者Mikelgo
相关产品推荐
相关产品推荐

