Loggfila: void returtypen konvertert til en hvilken som helst type?

stemmer
18

Jeg synes ikke å være i stand til å forstå hvorfor følgende kode ikke heve feil:

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

Jeg tydelig at den typen bør være en rekke funksjoner som returnerer void, men jeg skyver det en funksjon som returnerer en stringog likevel kompilatoren ikke klage. Hvis jeg endre definisjonen av rgå

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

Kompilatoren begynner å klage.

Er dette en bug eller er det hvordan tomrommet returtypen er ment å fungere (dvs. noe går hvis voidbrukes, i utgangspunktet gjør det samme som returtype any)?

Publisert på 06/10/2012 klokken 16:34
kilden bruker
På andre språk...                            


2 svar

stemmer
19

Dette er design (jeg vil forklare hvorfor det er god design kort tid). Spec sier (i seksjon 3.6.3, forkortet for klarhet):

En type S er overførbar til en type T, og T er overdras fra S, hvis en av følgende betingelser er oppfylt ...

  • S og T er objekttyper og, for hvert medlem M i T, en av de følgende betingelser er oppfylt:

    • M er et anrop, konstruere eller indeks signatur og S inneholder en samtale, konstruere eller indeks signatur N der

      • resultattypen M er ugyldig, eller resultattypen N er overdras til den av M.

I dette tilfellet, tester vi om () => stringer overdras til () => void. Så enten stringmå være overdras til void(det er ikke), eller voidmå være void(det er).


I praksis regelen her er at du har lov til å kaste bort returverdien , som er konsistent med hvordan f.eks C ++ behandler voidi malen oppløsning.

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?

Når vi begrense den typen changetil å være (widget) => void, gjør vi det slik at du kan passere decrementWidgetHeightsom andre argument, selv om den har en returverdi, men fortsatt gjør sikker på at når vi skriver kroppen av applyToManyWidgets, vi ikke tilfeldigvis bruke returnere verdien av changehvor som helst.

Legg merke til at voiddet fortsatt annerledes enn anyfordi dette er ikke uautorisert:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Svarte 06/10/2012 kl. 21:06
kilden bruker

stemmer
0

Det ser ut som en bug. Du bør åpne en ny arbeidselement for utstedelse

Svarte 06/10/2012 kl. 17:38
kilden bruker

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