Das Typoskript-Handbuch enthält derzeit keine Pfeilfunktionen. Normale Funktionen können generisch mit folgender Syntax eingegeben werden: Beispiel:
function identity<T>(arg: T): T {
return arg;
}
Wie lautet die Syntax für Pfeilfunktionen?
typescript
Andreas Frische
quelle
quelle
const foo
? dhtype GenericFun<T, A=T> = (payload: A) => T;
dannconst foo: GenericFun
noch generisch machen ohne einenT
typ anzugeben?GenericFun<T, A=T>
definiert eine Menge, die unter anderem andere TypenGenericFun<number>
und enthältGenericFun<string>
. Das Zulassen, dass generische Typen direkt eine Typanmerkung darstellen - z. B. constconst foo: GenericFun
- würde jedoch dazu neigen, die statische Sicherheit zuconst foo: GenericFun<string>
const foo: GenericFun<number>
.tsx
Datei (TypeScript + JSX). In einer.ts
Datei funktioniert es einwandfrei, wie Sie auf dem TypeScript-Spielplatz sehen können .const foo = <T,>(x: T) => x;
, um die JSX-Mehrdeutigkeit zu umgehen.Ich fand das obige Beispiel verwirrend. Ich verwende React und JSX, daher denke ich, dass dies das Szenario kompliziert hat.
Ich habe von TypeScript Deep Dive eine Klarstellung erhalten , in der für Pfeilgenerika Folgendes angegeben ist:
Problemumgehung: Verwenden Sie die Erweiterung des generischen Parameters, um den Compiler darauf hinzuweisen, dass es sich um einen generischen Parameter handelt. Dies stammt aus einem einfacheren Beispiel, das mir geholfen hat.
quelle
Wenn Sie sich in einer
.tsx
Datei befinden, können Sie nicht einfach schreiben<T>
, aber das funktioniert:Im Gegensatz zum
extends {}
Hack bewahrt dieser Hack zumindest die Absicht.quelle
const foo = <T = any,>(x: T) => x
funktioniert nicht ...Die Sprachspezifikation sagt auf S.64f
Beispiel:
quelle
Das funktioniert bei mir
quelle
.ts
Datei funktioniert dies. Ansonsten muss man verlängern.Während die populäre Antwort mit
extends {}
funktioniert und besser ist alsextends any
, zwingt sie dasT
, ein Objekt zu seinUm dies zu vermeiden und die Typensicherheit zu erhalten, können Sie
extends unknown
stattdessen verwendenquelle
Ich benutze diese Art von Erklärung:
Es ermöglicht das Definieren zusätzlicher Requisiten für Ihre Funktion, falls dies jemals erforderlich sein sollte, und in einigen Fällen hilft es dabei, den Funktionskörper sauberer von der generischen Definition zu halten.
Wenn Sie keine zusätzlichen Requisiten benötigen (Namespace), können Sie dies vereinfachen:
quelle
so spät, aber mit ES6 keine Notwendigkeit verlängert es funktioniert immer noch für mich .... :)
quelle
<T, >
. wie in @Thomas Kommentar unter @jbmilgrom 'Antwort beschrieben