Typescript: tip void convertit la orice tip?

voturi
17

Mi se pare a nu fi în măsură să înțeleagă de ce codul de mai jos nu ridică eroare:

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

Declar în mod clar că tipul ar trebui să fie o serie de funcții care returnează void, cu toate acestea am împinge acolo o funcție care returnează o stringși totuși compilatorul nu se plânge. Dacă aș schimba definiția rgpentru

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

Compilatorul începe să se plângă.

Este o eroare sau este modul în care se presupune că tipul void întoarcere la locul de muncă ( de exemplu , orice merge în cazul în care voidse utilizează, în principiu , ea face la fel ca și tipul de retur any)?

Întrebat 06/10/2012 la 17:34
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
17

Acest lucru este prin design (voi explica de ce este bun design în scurt timp). Spec spune (în secțiunea 3.6.3, prescurtat pentru claritate):

Un tip S este repartizabile un tip T, și T este alocabilă de la S, dacă una dintre următoarele este adevărat ...

  • S și ​​T sunt tipuri de obiecte și, pentru fiecare membru M în T, una dintre următoarele afirmații este adevărată:

    • M este un apel, să construiască sau indicele de semnătură și S conține un apel, să construiască sau indicele de semnătură N unde

      • tipul rezultat al M este Vidul sau tipul rezultat al N este repartizabile că M.

În acest caz, suntem de testare în cazul în care () => stringeste repartizabile () => void. Deci , fie stringtrebuie să fie repartizabile void(nu este), sau voidtrebuie să fie void(este).


De fapt, regula aici este vi se permite să arunce valoarea de returnare , care este în concordanță cu modul de exemplu C ++ tratează voidîn rezoluția șablon.

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?

Când ne constrânge tipul de changea fi (widget) => void, noi o face , astfel încât să puteți trece decrementWidgetHeightca al doilea argument , chiar dacă are o valoare de întoarcere, dar încă asigurându - vă că , atunci când vom scrie corpul applyToManyWidgets, noi nu folosim accidental întoarce valoarea de changeoriunde.

Rețineți că voideste încă diferit decât pentru anycă acest lucru este nepermise:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Publicat 06/10/2012 la 22:06
sursa de către utilizator

voturi
0

Pare a fi un bug. Ar trebui să deschidă un nou element de lucru pentru problema

Publicat 06/10/2012 la 18:38
sursa de către utilizator

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