Проблема
Как я могу правильно выставить сигнатуру реализации перегрузки?
Пример
На основе этого вопроса:
interface MyMap<T> {
[id: string]: T;
}
type Options = {
asObject?: boolean,
other?: Function
testing?: number
};
function get(options: { asObject: true, other?: Function, testing?:number }): MyMap<any>;
function get(options: { asObject?: false, other?: Function, testing?:number }): number[];
function get(): any[];
function get(options: Options = { asObject: false }): any[] | MyMap<any> {
if (options?.asObject) return {} as MyMap<any>;
return [];
}
Как я могу обернуть эту функцию, но сохранить возможные типы возвращаемых значений в зависимости от аргумента параметров?
Например:
function wrapFunction(arg1 arg2, options) {
// do something with arg1 and arg2
return get(options)
}
В зависимости от значения, установленного для параметров в методе wrapFunction, тип возвращаемого значения будет основан на типе возвращаемого значения get с тем же значением.
ie:
const g = wrapFunction(1,2, {asObject: true})
// Should return the same thing as get({asObject:true})
Попытки решения
Я мог бы просто переписать новую сигнатуру для функции wrapFunction, но это было бы довольно многословно, особенно если у меня есть много типов функций wrap, которые следуют одному и тому же шаблону вложенного вызова get
.
Одно предложение заключалось в следующем: введите функцию wrapFunction как typeof get
, но это лишает возможности изменять список параметров функции wrapFunction.
Это может связаны.
const b = g({ asObject: true })
будетany[] | MyMap<any>
, а не толькоMyMap<any>
из первой подписи. - person Justin Dalrymple   schedule 27.01.2021g
имеет следующую подпись:function g(options?: Options) ...
гдеoptions?: Options
разрешает третью перегрузку - person Aleksey L.   schedule 28.01.2021