Подтвердить что ты не робот

Каков синтаксис функций Typescript для стрелок с дженериками?

Справочник typescript в настоящее время ничего не имеет о функциях стрелок. Нормальные функции может быть типично типизирован с этим синтаксисом: Пример:

function identity<T>(arg: T): T {
    return arg;
}

Каков синтаксис функций стрелок?

4b9b3361

Ответ 1

Спецификация языка говорит на стр .64f

Конструкция формы <T> (...) = > {...} можно проанализировать как выражение функции функции с параметром типа или утверждением типа применяется к функции стрелки без параметра типа. Он разрешен как первый [..]

Пример:

// helper function needed because Backbone-couchdb sync does not return a jqxhr
let fetched = <
           R extends Backbone.Collection<any> >(c:R) => {
               return new Promise(function (fulfill, reject) {
                   c.fetch({reset: true, success: fulfill, error: reject})
               });
           };

Ответ 2

Полный пример, объясняющий синтаксис , на который ссылается Робин... принес мне его домой:

Общие функции

Что-то вроде следующего отлично работает:

function foo<T>(x: T): T { return x; }

Однако использование универсальной функции со стрелкой не поможет:

const foo = <T>(x: T) => x; // ERROR : unclosed 'T' tag

Обходной путь: используйте extends для универсального параметра, чтобы подсказать компилятору что это универсальный, например:

const foo = <T extends unknown>(x: T) => x;

Ответ 3

Я нашел приведенный выше пример сбивающим с толку. Я использую React и JSX, поэтому я думаю, что это усложнило сценарий.

Я получил пояснение от TypeScript Deep Dive, в котором говорится об обобщениях стрелок:

Обходной путь. Используйте параметр extends для универсального параметра, чтобы указать компилятору, что он является универсальным, это произошло из более простого примера, который мне помог.

    const identity = < T extends {} >(arg: T): T => { return arg; }

Ответ 4

Если вы находитесь в файле .tsx вы не можете просто написать <T>, но это работает:

const foo = <T, >(x: T) => x;

В отличие от взлома extends {}, этот взлом по крайней мере сохраняет намерение.

Ответ 5

Это работает для меня

const Generic = <T> (value: T) => {
    return value;
} 

Ответ 6

хотя популярный ответ с extends {} работает и лучше, чем extends any, он заставляет T быть объектом

const foo = <T extends {}>(x: T) => x;

чтобы избежать этого и сохранить безопасность типов, вместо этого вы можете использовать extends unknown

const foo = <T extends unknown>(x: T) => x;