TypeScript配置数组聚合函数类型修复:自动补全异常问题
解决TypeScript管道式Config数组自动补全失效问题
核心问题在于普通数组类型会自动拓宽元素类型,丢失了前序步骤的类型上下文,导致编辑器无法感知fn参数的管道式依赖。以下是基于递归元组类型的修复方案,既能保留类型推断的管道特性,又能恢复编辑器自动补全功能:
类型定义实现
// 单个配置项:State为当前步骤输入状态,NextState为输出状态 type ConfigItem<State, NextState> = { fn: (state: State) => NextState; // 可添加其他业务属性 name?: string; }; // 递归构建管道式元组,强制每个后续项的输入类型继承前一项的输出类型 type PipelineConfig<StateChain extends any[]> = StateChain extends [...infer PrevStates, infer LastState] ? [ ...PrevStates, ConfigItem<LastState, any>, ...PipelineConfig<[...PrevStates, ReturnType<ConfigItem<LastState, any>['fn']>]> ] : [ConfigItem<any, any>]; // 处理函数,约束入参为管道式元组 function processPipeline<Config extends PipelineConfig<[]>>(config: Config) { // 函数实现无需修改,类型约束已生效 return config.reduce((state, item) => item.fn(state), {} as any); }
使用示例(自动补全生效)
processPipeline([ { fn: (state: { id: number }) => ({ ...state, name: 'test' }) }, { fn: (state) => { // state自动推断为 { id: number; name: string } return { ...state, enabled: true }; } }, // 新增对象时,编辑器会自动补全`fn`属性,且state参数类型自动继承前一步返回值 { fn: (state) => { // state类型为 { id: number; name: string; enabled: boolean } return state; } } ]);
可选:指定初始状态类型
如果需要固定初始状态,可调整泛型参数:
type PipelineConfig<InitialState, StateChain extends any[] = [InitialState]> = StateChain extends [...infer PrevStates, infer LastState] ? [ ...PrevStates, ConfigItem<LastState, any>, ...PipelineConfig<InitialState, [...PrevStates, ReturnType<ConfigItem<LastState, any>['fn']>]> ] : never; function processPipeline<InitialState, Config extends PipelineConfig<InitialState>>( config: Config, initialState: InitialState ) { return config.reduce((state, item) => item.fn(state), initialState); } // 使用示例 processPipeline([ { fn: (state: number) => state.toString() }, { fn: (state) => state.length }, ], 123);
内容的提问来源于stack exchange,提问作者Aaron Scherling
相关产品推荐
相关产品推荐

