Typescript: Как набрать функцию с использованием универсального типа в этом случае? - PullRequest
2 голосов
/ 31 октября 2019

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

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}
}

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Пока что я не вижу варианта использования 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; }

Надеемся, что это соответствуеттвои нужды. Удачи!

Ссылка на код

0 голосов
/ 01 ноября 2019

Чтобы подвести итог, просто измените с

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

на

type FuncType = <T>(value: T) => T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...