TypeScript如何根据函数入参options对象动态推导返回类型并保留智能提示
解决方案
通过泛型+映射类型即可实现自动推导返回类型,无需编写大量重载,新增配置项只需维护1行映射关系,同时支持完整的智能提示。
类型定义
// 基础配置与返回接口定义 interface Selectable { selectable: boolean; } interface SelectableReturn { selected: {value:any, index:number} } interface Distant { distant: boolean; } interface DistantReturn { distances: number[]; } // 【核心】配置项与返回类型的映射表,新增配置仅需在此处添加一行 type OptionsReturnMap = { selectable: SelectableReturn, distant: DistantReturn } // 自动生成合法入参options的类型 type AllCreateArrayOptions = { [K in keyof OptionsReturnMap]?: boolean } // 自动计算返回类型的工具类型 type CreateArrayReturn<Options extends AllCreateArrayOptions | undefined> = any[] & ( Options extends undefined ? unknown : { [K in keyof Options]: Options[K] extends true ? OptionsReturnMap[K] : unknown }[keyof Options] )
函数声明
无需编写任何重载,仅需1行泛型声明:
declare function createArray<Options extends AllCreateArrayOptions | undefined>( arr: any[], options?: Options ): CreateArrayReturn<Options>
使用效果
调用时自动推导返回类型,支持完整智能提示:
- 无options调用:
const arr1 = createArray([1,2,3]),返回类型为any[] - 传入
selectable: true:const arr2 = createArray([1,2,3], {selectable: true}),返回类型为any[] & SelectableReturn,可直接提示selected属性 - 传入
distant: true:const arr3 = createArray([1,2,3], {distant: true}),返回类型为any[] & DistantReturn,可直接提示distances属性 - 同时传入多个配置:
const arr4 = createArray([1,2,3], {selectable: true, distant: true}),返回类型为any[] & SelectableReturn & DistantReturn,同时提示两个扩展属性
扩展规则
后续新增配置项时仅需两步:
- 定义新增配置的入参类型和对应返回类型
- 在
OptionsReturnMap中添加对应映射关系即可,无需修改函数声明
内容的提问来源于stack exchange,提问作者Alan Blanchet
相关产品推荐
相关产品推荐

