Какова синтаксис стрелочных функций TypeScript с обобщениями?
На данный момент в руководстве по TypeScript нет информации об стрелочных функциях. Обычные функции могут быть обобщенно типизированы с помощью следующего синтаксиса:
function identity<T>(arg: T): T {
return arg;
}
Какой синтаксис следует использовать для стрелочных функций?
5 ответ(ов)
В файле .tsx
вы не можете просто написать <T>
, но это будет работать:
const foo = <T, >(x: T) => x;
В отличие от «хака» с extends {}
, этот подход по крайней мере сохраняет суть.
Этот код работает для меня:
const Generic = <T>(value: T) => {
return value;
}
Здесь мы создаем универсальную функцию Generic
, которая принимает параметр типа T
и возвращает его. Это позволяет использовать функцию для различных типов данных.
В спецификации языка на стр. 64 и далее указано, что конструкция вида < T > ( ... ) => { ... }
может быть интерпретирована как выражение стрелочной функции с параметром типа или как утверждение типа, применяемое к стрелочной функции без параметра типа. Однако на практике она разрешается как первое.
Вот пример:
// Вспомогательная функция, необходимая, потому что sync в Backbone-couchdb не возвращает jqxhr
let fetched = <R extends Backbone.Collection<any>>(c: R) => {
return new Promise(function (fulfill, reject) {
c.fetch({reset: true, success: fulfill, error: reject});
});
};
В этом примере создается функция, которая принимает коллекцию R
, расширяющую Backbone.Collection
. При этом используется обобщенный тип для корректного Fetch-запроса.
Конечно! Вот перевод на русский в стиле ответа на StackOverflow.com:
Хотя решение было предложено не так давно, в ES6 нет необходимости использовать extends
, и это все равно работает для меня... 😃
let getArray = <T>(items: T[]): T[] => {
return new Array<T>().concat(items);
}
let myNumArr = getArray<number>([100, 200, 300]);
let myStrArr = getArray<string>(["Hello", "World"]);
myNumArr.push(1);
console.log(myNumArr);
В данном коде мы определяем универсальную функцию getArray
, которая принимает массив элементов типа T
и возвращает новый массив, используя метод concat
. Это позволяет нам создавать массивы различных типов, как видно из примеров с числовым и строковым массивами. После добавления элемента в числовой массив через push
, мы можем увидеть результат в консоли.
Если есть вопросы или нужно что-то уточнить — не стесняйтесь задавать!
Это работает для меня
const logSomething = <T>(something: T): T => {
return something;
}
Функция logSomething
является универсальной (generic) и принимает один аргумент something
любого типа T
, а затем возвращает этот же аргумент. Она может быть полезна для логирования или в ситуациях, когда нужно возвращать переданное значение без изменений.
Интерфейсы vs Типы в TypeScript
Возможно ли использование функций с строгой типизацией в качестве параметров в TypeScript?
Как запустить файлы TypeScript из командной строки?
Как определить тип для функции-коллбэка (как любой тип функции, а не универсальный any) в параметре метода
Какой тип имеет проп 'children'?