У посібнику з машинопису в даний час немає нічого із функцій стрілки. Нормальні функції можна загалом набрати за допомогою цього синтаксису: приклад:
function identity<T>(arg: T): T {
return arg;
}
Що таке синтаксис функцій стрілки?
У посібнику з машинопису в даний час немає нічого із функцій стрілки. Нормальні функції можна загалом набрати за допомогою цього синтаксису: приклад:
function identity<T>(arg: T): T {
return arg;
}
Що таке синтаксис функцій стрілки?
Відповіді:
Повний приклад, що пояснює синтаксис, на який посилається Робін ... приніс його додому:
Щось подібне працює чудово:
function foo<T>(x: T): T { return x; }
Однак використання загальної функції зі стрілкою не буде:
const foo = <T>(x: T) => x; // ERROR : unclosed `T` tag
Обхід: Використовуйте розширення на загальний параметр, щоб натякнути компілятору, що він є загальним, наприклад:
const foo = <T extends unknown>(x: T) => x;
GenericFun<T, A=T>визначає набір, який включає інші типи GenericFun<number> і GenericFun<string>, серед інших. З урахуванням загального типу , щоб скласти анотацію типу безпосередньо - наприклад , Const const foo: GenericFun- однак, буде мати тенденцію до ослаблення безпеки статичної віднесеної вимагаючи специфічність , наприклад , const foo: GenericFun<string>абоconst foo: GenericFun<number>
.tsxфайлі (TypeScript + JSX). У .tsфайлі він працює чудово, як ви бачите на майданчику TypeScript .
const foo = <T,>(x: T) => x;коду, що переходить вперед, щоб пройти двозначність JSX.
Я знайшов приклад вище заплутаним. Я використовую React і JSX, тому я думаю, що це ускладнило сценарій.
Я отримав роз'яснення з TypeScript Deep Dive , де вказано дженерики стрілок:
Обхід: Використовуючи розширення на загальний параметр, щоб натякнути компілятору, що він є загальним, це виходило з більш простого прикладу, який мені допоміг.
const identity = < T extends {} >(arg: T): T => { return arg; }
Якщо ви знаходитесь у .tsxфайлі, ви не можете просто написати <T>, але це працює:
const foo = <T, >(x: T) => x;
На відміну від extends {}злому, цей хак принаймні зберігає наміри.
const foo = <T = any,>(x: T) => xне працює ...
Специфікація мови зазначена на стор.64f
Конструкція форми <T> (...) => {...} може бути проаналізована як вираз функції стрілки з параметром типу або твердженням типу, застосованим до функції стрілки без параметра типу. Він вирішений як колишній [..]
приклад:
// helper function needed because Backbone-couchdb's 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})
});
};
Це працює для мене
const Generic = <T> (value: T) => {
return value;
}
.tsфайлі це працює. Інакше треба продовжити.
в той час як популярна відповідь extends {}працює і є кращою, ніж extends anyвона примушує Tбути об'єктом
const foo = <T extends {}>(x: T) => x;
щоб уникнути цього і зберегти безпеку типу, ви можете використовувати його extends unknownзамість цього
const foo = <T extends unknown>(x: T) => x;
Я повинен використовувати такий тип декларації:
const identity: { <T>(arg: T): T } = (arg) => arg;
Це дозволяє визначити додаткові реквізити до вашої функції, якщо вам коли-небудь потрібно, а в деяких випадках - це допомагає зберегти тіло функції чистішим від загального визначення.
Якщо вам не потрібні додаткові реквізити (подібний предмет простору імен), його можна спростити до:
const identity: <T>(arg: T) => T = (arg) => arg;
так пізно, але з ES6 немає потреби продовжувати, він все ще працює для мене .... :)
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)
<T, >. як описано в коментарі @Thomas під відповіддю @jbmilgrom
const foo? тобтоtype GenericFun<T, A=T> = (payload: A) => T;робитиconst foo: GenericFunще загальним, не надаючиTтип?