Typescript: как в этом случае ввести функцию с использованием универсального типа?

У меня есть это определение типа

type FuncType<T> = (value: T) => T

Я хочу реализовать функцию, используя этот тип, который будет выглядеть так:

const myFunc: FuncType<T> = (value) => value;

и используйте его следующим образом:

const a: string = myFunc<string>('a');
const b: number = myFunc<number>(2);

Но, конечно, предыдущая строка const myFunc: FuncType<T> = (value) => value; не имеет корректного синтаксиса.

Как это должно быть написано?


Примечание: я нашел обходной путь с помощью промежуточной функции, но было бы неплохо избежать этого бесполезного каррирования (которое я все равно не могу использовать в моем реальном случае, потому что оно связано с хуком реакции и хуками реакции не терпит каррирования):

const myFunc = <T>(): FuncType<T> => (value) => value;
const a: string = myFunc<string>()('a');
const b: number = myFunc<number>()(2);


Почему мне нужно использовать псевдоним этого типа и я не могу писать напрямую?

const myFunc = <T>(value: T): T => value;

Потому что в моем реальном случае определение типа моей функции не так просто.

Это выглядит примерно так:

interface FuncType<T> {
  (args: {arg1: T}): {res1: T}
  (args: {arg1: T, arg2: T}): {res1: T, res2: T}
}

person Alexandre Annic    schedule 31.10.2019    source источник
comment
Вам действительно нужен псевдоним типа? Может быть, вы могли бы просто function myFunc<T>(value: T) : T { return value; }   -  person Aleksey L.    schedule 31.10.2019
comment
@АлексейЛ. Я обновил свой вопрос, чтобы ответить на ваш.   -  person Alexandre Annic    schedule 31.10.2019
comment
Вопрос в том, используете ли вы этот тип в нескольких местах? Если да, покажите пример использования. В противном случае мое предложение остается в силе - добавьте столько перегрузок, сколько необходимо.   -  person Aleksey L.    schedule 01.11.2019


Ответы (2)


Пока я не вижу варианта использования FuncType в качестве псевдонима универсального типа для конкретной перегруженной функции. Не могли бы вы вместо этого сделать его псевдонимом конкретного типа для универсальной перегруженной функции? Как это:

interface FuncType {
  <T>(args: { arg1: T }): { res1: T }
  <T>(args: { arg1: T, arg2: T }): { res1: T, res2: T }
}

Тогда FuncType всегда будет ссылаться на то, что принимает любое T, и вы можете использовать его так, как хотите:

const myFunc: FuncType =
  (value: { arg1: any, arg2?: any }) => ({ res1: value.arg1, res2: value.arg2 });

const a = myFunc<string>({ arg1: "" }); // { res1: string; }
const b = myFunc<number>({ arg1: 1, arg2: 2 }); // { res1: number; res2: number; }

Надеюсь, это соответствует вашим потребностям. Удачи!

Link to code< /а>

person jcalz    schedule 31.10.2019

Подводя итог, просто измените

type FuncType<T> = (value: T) => T

to

type FuncType = <T>(value: T) => T
person Alexandre Annic    schedule 01.11.2019