Was bedeutet "=>" in TypeScript? (Fetter Pfeil)


76

Ich habe gerade angefangen, TypeScript zu lernen, und ich habe gesehen, dass mit dieser Sytax viel Code vorhanden ist =>. Ich habe einige Nachforschungen angestellt, indem ich die Spezifikation von TypeScript Version 1.6 gelesen und etwas gegoogelt habe. Ich kann die Bedeutung von immer noch nicht verstehen =>.
Für mich fühlt es sich wie ein Zeiger in C ++ an. Aber ich kann es nicht bestätigen. Wenn jemand die folgenden Beispiele erklären kann, ist das großartig. Vielen Dank!

Hier sind die Beispiele, die ich beim Lesen der Spezifikation von Typescript gefunden habe:

Objekttypen

var MakePoint: () => {  
    x: number; y: number;  
};

Frage: Was macht dieser Code? Erstellen eines Objekts namens MakePoint , bei dem x- und y-Felder vom Typ Zahl sind ? Ist dies ein Konstruktor oder eine Funktion für MakePoint ?

Funktionstypen

function vote(candidate: string, callback: (result: string) => any) {  
 // ...  
}

Frage: Was bedeutet das => any? Müssen Sie einen Zeichenfolgentyp zurückgeben?

Kann mir jemand den Unterschied oder den Zweck dieser Beispiele in einfachem Englisch erklären? Vielen Dank für Ihre Zeit!


Antworten:


91

Möglicherweise verwechseln Sie Typinformationen mit einer Funktionsdeklaration. Wenn Sie Folgendes kompilieren :

var MakePoint: () => {x: number; y: number;};

Sie werden sehen, dass es produziert:

var MakePoint;

In TypeScript ist alles, was nach dem :aber vor einer =(Zuweisung) kommt, die Typinformation. Ihr Beispiel besagt also, dass der Typ von MakePoint eine Funktion ist, die 0 Argumente akzeptiert und ein Objekt mit zwei Eigenschaften xund ybeiden Zahlen zurückgibt . Dieser Variablen wird keine Funktion zugewiesen. Im Gegensatz dazu kompilieren:

var MakePoint = () => 1;

produziert:

var MakePoint = function () { return 1; };

Beachten Sie, dass in diesem Fall der =>Fettpfeil nach dem Zuweisungsoperator steht.


2
Wenn MakePoint eine Funktion ist, warum nicht einfach die reguläre JavaScript-Funktionsdeklaration verwenden? Zum Beispiel function MakePoint() { ...} ?
Shaohao Lin

9
@ShaohaoLin Es ist kürzer und lässt den Namen ( ()=>...) weg. Der Umfang bleibt erhalten this, sodass Sie keine var self = thisVariablen mehr erstellen oder thisFunktionsargumente durchlaufen müssen. Mehr Infos hier
mk.

Wie kann ich auf die Immobilie zugreifen xund yin Ihrem Beispiel von var MakePoint = () => 1? xund ysind beide verbunden 1?
Shaohao Lin

1
@ShaohaoLin Im ersten Fall viaMakePoint().x . MakePointist eine Funktion, die ein Objekt mit einer Eigenschaft zurückgibt x. Aber im zweiten Fall müssen Sie es umschreiben var MakePoint = () => ({x: 1, y: 1});(beachten Sie das ()um das Objekt herum), damit es das gewünschte Objekt anstelle der Nummer 1 (die ich als Beispiel verwendet habe) zurückgibt.
mk.

@ShaohaoLin Es tut mir leid, ich verstehe nicht, was Sie in Ihrer hinzugefügten Frage fragen. Normalerweise ist es viel einfacher, nur eine neue Frage zu stellen, da Sie mehr Platz haben, um die Frage zu erklären. Wenn Sie später Informationen hinzufügen, verwirrt dies die Leser und niemand wird zurückkommen, um sich Ihre Änderungen / neuen Fragen anzusehen.
mk.

28

In einer Art , Position, =>definiert einen Funktionstyp in der die Argumente auf der linken Seite der ARE =>und die Rückgabetyp ist auf der rechten Seite . Bedeutet callback: (result: string) => anyalso " callbackist ein Parameter, dessen Typ eine Funktion ist. Diese Funktion verwendet einen Parameter, der als resultTyp bezeichnet wird string, und der Rückgabewert der Funktion ist vom Typ any".

Informationen zum Konstrukt auf Ausdrucksebene finden Sie unter Was bedeutet "=>" (ein Pfeil, der aus gleich und größer als) in JavaScript gebildet wird?


Ist Rückruf in diesem Fall nur der Name der Funktion?
Shaohao Lin

1
@ShaohaoLin ist der Name eines Parameters, und der Typ dieses Parameters ist eine Funktion (aber der Name der Funktion, die Sie als Argument übergeben, kann beliebig sein)
mk.

Dies ist eigentlich die einzige Antwort, die erklärt, dass es einen Unterschied zwischen dem fetten Pfeil im Typoskript und im Emca-Skript gibt
oshell

@ryan, kannst du erklären was das bedeutet? p => this.people = pWas macht die zweite Gleichheitsnote hier?
Vigamage

1
Ja, aber was bedeutet die gesamte Zeile? ist es "p ist eine Variable, deren Typ beliebig sein kann und die diese zurückgibt. Personen, deren Wert gleich p ist (rechts)?"? Aber ich kann es trotzdem nicht verstehen. :(
Vigamage

20
var MakePoint: () => {  
    x: number; y: number;  
};

MakePointist eine Variable. Der Typ ist eine Funktion, die keine Argumente akzeptiert und die Zahlen x und y erzeugt. Macht der Pfeil jetzt Sinn?


1
Das Obige ist die beste Antwort.
Niklas R.

14

Wie ein weiser Mann einmal sagte "Ich hasse JavaScript, da es dazu neigt, die Bedeutung davon allzu leicht zu verlieren".

Es wird als Fettpfeil (weil ->es ein dünner Pfeil und =>ein Fettpfeil ist) und auch als Lambda-Funktion (wegen anderer Sprachen) bezeichnet. Ein weiteres häufig verwendetes Merkmal ist die Fettpfeilfunktion ()=>something. Die Motivation für einen fetten Pfeil ist:

  1. Sie müssen nicht weiter tippen function.
  2. Es erfasst lexikalisch die Bedeutung von this.
  3. Es erfasst lexikalisch die Bedeutung von arguments

function Person(age) {
this.age = age;
this.growOld = function() {
    this.age++;
  }
}

var person = new Person(1);
setTimeout(person.growOld,1000);

setTimeout(function() { console.log(person.age); },2000); // 1, should have been 2

Wenn Sie diesen Code im Browser ausführen, zeigt dieser in der Funktion auf das Fenster, da das Fenster das ist, was die growOld-Funktion ausführt. Fix ist die Verwendung einer Pfeilfunktion:


function Person(age) {
this.age = age;
this.growOld = () => {
    this.age++;
  }
}
var person = new Person(1);
setTimeout(person.growOld,1000);

setTimeout(function() { console.log(person.age); },2000);// 2

6

Es wird ein "fetter Pfeil" genannt. Es wurde in EcmaScript6 hinzugefügt und ersetzt unter anderem das Funktionsschlüsselwort.

Mehr kann hier gelesen werden .


3

Direkt vom Link in OP:

In diesem Beispiel hat der zweite Parameter zum Abstimmen den Funktionstyp

(Ergebnis: Zeichenfolge) => any, was bedeutet, dass der zweite Parameter eine Funktion ist, die den Typ 'any' zurückgibt und einen einzelnen Parameter vom Typ 'string' mit dem Namen 'result' hat.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.