Typoskript: void Art Rückkehr zu irgendeiner Art umgewandelt?

stimmen
17

Ich scheine nicht in der Lage sein, zu verstehen, warum der folgende Code Fehler nicht erhöhen:

var rg: {(): void;}[] = [];
rg.push(function():string {return ;})

Ich klar zum Ausdruck , dass der Typ sollte eine Reihe von Funktionen, die zurückkehren void, aber ich dort drücken , um eine Funktion , die eine zurückgibt stringund doch ist der Compiler beschwert sich nicht. Wenn ich die Definition ändern von rgbis

var rg: {():number;}[] = [];

Der Compiler beginnt sich zu beschweren.

Ist das ein Bug oder ist es , wie der Rückgabetyp void funktionieren soll (dh alles geht , wenn voidverwendet wird, im Grunde ist es das gleiche wie Rückgabetyp zu machen any)?

Veröffentlicht am 06/10/2012 um 17:34
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
17

Das ist von Entwurf (ich werde erklären, warum es ist ein gutes Design in Kürze). Die Spezifikation sagt (in Abschnitt 3.6.3, für Klarheit gekürzt):

Ein Typ S ist zuordenbar einem Typ T und T zuweisbare von S, wenn einer der folgenden Punkte zutrifft ...

  • S und T sind Objekttypen und für jedes Element in M ​​T, eine der folgenden Bedingungen zutrifft:

    • M ist ein Aufruf, konstruieren oder Index Unterschrift und S einen Aufruf enthält, konstruieren oder Index Signatur N wobei

      • Der Ergebnistyp von M entfällt, oder der Ergebnistyp der N zuweisbaren die von M.

In diesem Fall sind wir testen , ob () => stringist zuordenbar () => void. Also entweder stringhat seine zuordenbar void(es ist nicht), oder voidmuss sein void(es ist).


In der Tat, hier die Regel dürfen Sie den Rückgabewert wegzuwerfen , die mit , wie zB C ++ behandelt konsistent ist voidin Vorlage Auflösung.

function decrementWidgetHeight(w: Widget): number {
    // ... returns the new height of the widget
}

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void {
    // for each widget in the array, apply 'change' to it
}

// Later...
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed?

Wenn wir die Art des einschränken changezu sein (widget) => void, wir machen es so , dass Sie passieren können decrementWidgetHeightals das zweite Argument , auch wenn es einen Rückgabewert hat, aber immer noch dafür sorgen , dass , wenn wir den Körper schreiben applyToManyWidgets, dass wir nicht aus Versehen der Verwendung Rückgabewert von changeüberall.

Beachten Sie, dass voidimmer noch anders ist , als anyweil dies unallowed:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Beantwortet am 06/10/2012 um 22:06
quelle vom benutzer

stimmen
0

Das sieht aus wie ein Bug. Sie sollten eine eröffnen neue Arbeitseinheit für die Ausgabe

Beantwortet am 06/10/2012 um 18:38
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more