如何移除TypeScript Interface属性中包裹类型的泛型得到原始类型
解决方案
你可以通过TypeScript的条件类型+infer推断+映射类型实现自动解包,不需要手动改写每个属性:
第一步:定义解包工具类型
// 泛型判断:如果输入类型是ResultModifier包裹的,返回内部的泛型参数,否则原样返回 type UnwrapResultModifier<T> = T extends ResultModifier<infer InnerType> ? InnerType : T;
第二步:遍历原接口生成目标类型
type ServerMessagesWithoutGenerics = { [Key in keyof ServerMessages]: UnwrapResultModifier<ServerMessages[Key]> };
效果验证
生成的ServerMessagesWithoutGenerics和你预期的接口结构完全一致,你可以通过以下方式测试:
// 测试EVENT_3的类型,会被正确推断为ResponseEventBody3,而非ResultModifier<ResponseEventBody3> type TestEvent3Type = ServerMessagesWithoutGenerics[ActionType.EVENT_3];
这种方案的优势是后续你修改ServerMessages的属性时,转换后的类型会自动同步,无需手动维护两份接口定义。
内容的提问来源于stack exchange,提问作者Sergii Onish
相关产品推荐
相关产品推荐

