Gépelt: void visszatérési típus átalakítható bármilyen típusú?

szavazat
17

Úgy tűnik, hogy nem képes felfogni, hogy miért a következő kódot nem emel hiba:

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

Azt egyértelműen kimondják, hogy a típus legyen egy sor visszatérő függvények voidazonban megnyomtam ott egy függvény, amely visszaadja a stringés még a fordító nem panaszkodik. Ha meghatározásának módosítása rga

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

A fordító kezd panaszkodni.

Ez egy hiba, vagy ez hogyan void visszatérési típus is kellene dolgozni (azaz bármi, ha voidhasználjuk, alapvetően ezzel ugyanaz, mint a visszatérési típus any)?

A kérdést 06/10/2012 17:34
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
17

Ez tervezési (leírom, hogy miért ez a jó design rövidesen). A spec mondja (szakasz 3.6.3, rövidített érthetőség kedvéért):

A Type S hozzárendelhető egy T típusú T hozzárendeljük a S, ha az alábbiak közül melyik igaz ...

  • S és T jelentése objektum típusok, valamint minden egyes tagja F T, az alábbi igaz:

    • M jelentése egy hívást, konstrukció vagy indexaláíráshoz és S tartalmaz egy hívást, konstrukció vagy indexaláíráshoz N ahol

      • az eredmény típusa M érvénytelen, vagy az eredmény típusa N hozzárendelhető, hogy a M.

Ebben az esetben, tesztelés, ha () => stringhozzárendeljük a () => void. Tehát vagy stringkell lennie besorolható void(ez nem), vagy voidkell lennie void(ez).


Valójában a szabály itt is megengedett, hogy dobja el a visszatérési érték , ami összhangban van azzal, hogy hogyan pl C ++ kezeli voida sablon felbontásban.

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?

Amikor korlátozzák a típusú changelegyen (widget) => void, tesszük úgy, hogy akkor át decrementWidgetHeighta második érv ellenére, hogy a visszatérési érték, de még mindig ügyelve arra, hogy ha mi írjuk a testét applyToManyWidgets, nem véletlenül használja a visszatérési értéke changesehol.

Vegyük észre, hogy voidmég mindig más, mint anyazért, mert ez nem engedett:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Válaszolt 06/10/2012 22:06
a forrás felhasználó

szavazat
0

Úgy néz ki, mint egy bogár. Meg kell nyitni egy új munka tétel a kérdés

Válaszolt 06/10/2012 18:38
a forrás felhasználó

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