Убедитесь, что две функции принимают одинаковые типы параметров в TypeScript - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу создать обобщенную функцию c, которая принимает две функции в качестве параметров и возвращает результат. Я хочу, чтобы типы обеспечивали, чтобы обе функции имели одинаковую подпись, но не то, что эта подпись равна (кроме возвращаемого типа).

Я могу определить введите таким образом:

type Func<TResult> = (...args: any[]) => TResult;

function foo<TResult>(f: Func<TResult>, g: Func<TResult>): TResult { ... }

Который разрешает нужные параметры:

function f1(s: string, i: number): boolean { return true; }
function g1(s: string, i: number): boolean { return false; }
foo<boolean>(f1, g1);

К сожалению, он также разрешает функции с разными сигнатурами:

function g2(b: boolean): boolean { return false; }
foo<boolean>(f1, g2);

Возможно ли разрешить скомпилировать первый вызов, но не последний?

Обратите внимание, что я хочу, чтобы это работало для любого списка параметров (пустой, один параметр, два параметра и т. д. c.), но типы параметров для обеих функций должны совпадать.

1 Ответ

3 голосов
/ 29 февраля 2020

Вы можете добавить параметры другого типа для параметров и использовать кортежи в параметрах rest, чтобы распространить их на сигнатуру функции. Это обеспечит совпадение типов параметров двух функций (или, по крайней мере, совместимости)

type Func<TParams extends any[], TResult> = (...args: TParams) => TResult;

function foo<TParams extends any[], TResult>(f: Func<TParams, TResult>, g: Func<TParams, TResult>): TResult {
    return null!
}

function f1(s: string, i: number): boolean { return true; }
function g1(s: string, i: number): number { return 0; }
foo(f1, g1);


function g2(b: boolean): boolean { return false; }
foo(f1, g2);

игровая площадка

...