Справочник typescript в настоящее время ничего не имеет о функциях стрелок. Нормальные функции может быть типично типизирован с этим синтаксисом: Пример:
function identity<T>(arg: T): T {
return arg;
}
Каков синтаксис функций стрелок?
Справочник typescript в настоящее время ничего не имеет о функциях стрелок. Нормальные функции может быть типично типизирован с этим синтаксисом: Пример:
function identity<T>(arg: T): T {
return arg;
}
Каков синтаксис функций стрелок?
Спецификация языка говорит на стр .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})
});
};
Полный пример, объясняющий синтаксис , на который ссылается Робин... принес мне его домой:
Что-то вроде следующего отлично работает:
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;
Я нашел приведенный выше пример сбивающим с толку. Я использую React и JSX, поэтому я думаю, что это усложнило сценарий.
Я получил пояснение от TypeScript Deep Dive, в котором говорится об обобщениях стрелок:
Обходной путь. Используйте параметр extends для универсального параметра, чтобы указать компилятору, что он является универсальным, это произошло из более простого примера, который мне помог.
const identity = < T extends {} >(arg: T): T => { return arg; }
Если вы находитесь в файле .tsx
вы не можете просто написать <T>
, но это работает:
const foo = <T, >(x: T) => x;
В отличие от взлома extends {}
, этот взлом по крайней мере сохраняет намерение.
Это работает для меня
const Generic = <T> (value: T) => {
return value;
}
хотя популярный ответ с extends {}
работает и лучше, чем extends any
, он заставляет T
быть объектом
const foo = <T extends {}>(x: T) => x;
чтобы избежать этого и сохранить безопасность типов, вместо этого вы можете использовать extends unknown
const foo = <T extends unknown>(x: T) => x;