Typescript: void return type geconverteerd naar elk type?

stemmen
17

Ik lijken niet in staat om te begrijpen waarom de volgende code niet fout doet rijzen zijn:

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

Ik duidelijk dat het type een reeks functies die opnieuw moeten worden void, maar ik duw er een functie die een retourneert stringen toch de compiler niet klagen. Als ik de definitie van rgte

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

De compiler begint te klagen.

Is dit een bug of is het hoe het soort leegte return wordt geacht te werken (dat wil zeggen alles mag als voidwordt gebruikt, in principe maakt het hetzelfde als return type any)?

De vraag is gesteld op 06/10/2012 om 17:34
bron van user
In andere talen...                            


2 antwoorden

stemmen
17

Dit is zo ontworpen (Ik zal uitleggen waarom het goed ontwerp binnenkort). De spec zegt (in paragraaf 3.6.3, verkorte voor de duidelijkheid):

Een type S is toewijsbaar aan een type T, en T toewijsbare uit S, als een van de volgende waar ...

  • S en T objecttypen en ieder lid M in T, een van de volgende geldt:

    • M een gesprek construct of handtekening index en S bevat een oproep bouwen of index signature N waarbij

      • het resultaat type M Void of het resultaat type N is toewijsbaar aan die van M.

In dit geval, testen we of () => stringis toewijsbaar aan () => void. Dus ofwel stringheeft toewijsbaar te zijn void(het is niet), of voidmoet zijn void(het is).


In feite, de regel is hier mag je weggooien de return waarde , die in overeenstemming is met de manier waarop bijvoorbeeld C ++ traktaties voidin template resolutie.

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?

Als we beperken het type changete zijn (widget) => void, maken we het zo dat je kan passeren decrementWidgetHeightals tweede argument, ook al heeft het een return waarde, maar nog steeds om ervoor te zorgen dat wanneer we het lichaam van schrijven applyToManyWidgets, wij niet per ongeluk gebruik maken van de terugkeer waarde van changeoveral.

Merk op dat voidis toch anders dan anyomdat dit niet is toegestaan:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
antwoordde op 06/10/2012 om 22:06
bron van user

stemmen
0

Dat ziet eruit als een bug. Je moet een te openen nieuw werkitem voor de afgifte

antwoordde op 06/10/2012 om 18:38
bron van user

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