Strojopisem: void typ návrat převeden na jakýkoli typ?

hlasů
17

Zdá se mi, že není schopen pochopit, proč následující kód nevyvolává chybu:

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

I jasně uvést, že typ má být řada funkcí, které vracejí void, ale já tlačit tu funkci, která vrací string, a přesto kompilátor nestěžuje. Mám-li změnit definici rgdo

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

Překladač začne stěžovat.

Je to chyba, nebo je to, jak je typ void výnos mělo fungovat (tj cokoliv, pokud voidse používá, v podstatě dělat to stejné, jako návratový typ any)?

Položena 06/10/2012 v 17:34
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
17

Toto chování je záměrné (budu vysvětlovat, proč je to dobrý návrh krátce). Spec říká (v kapitole 3.6.3, zkrácenou kvůli přehlednosti):

Typ S je převoditelná na typu T a T je přiřaditelná z S, je-li jeden z následujících je pravda ...

  • S a T jsou typy objektů a pro každý člen M v T, jedna z následujících podmínek:

    • M je hovor, postavit nebo index podpis a S obsahuje výzvu, postavit nebo index podpis N kde

      • Výsledný typ M je neplatné, nebo typ výsledkem N je přiřaditelná k tomu M.

V tomto případě budeme testovat, jestli () => stringje přiřaditelná k () => void. Takže buď stringmusí být převoditelná na void(není), nebo voidmusí být void(je).


Ve skutečnosti, pravidlo je zde máte možnost vyhodit návratovou hodnotu , která je v souladu s tím, jak například C ++ zachází voidv rozlišení šablony.

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?

Když jsme se omezit typ changebýt (widget) => void, děláme to tak, že můžete předat decrementWidgetHeightjako druhý argument, i když to má návratovou hodnotu, ale ještě ujistit, že když budeme psát tělo applyToManyWidgets, nemáme náhodou používat vrátit hodnoty changekdekoli.

Všimněte si, že voidje stále jiná, než anyproto, že se jedná Neoprávněné:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Odpovězeno 06/10/2012 v 22:06
zdroj uživatelem

hlasů
0

To vypadá jako brouk. Ty by měly otevřít novou pracovní položku pro vydávání

Odpovězeno 06/10/2012 v 18:38
zdroj uživatelem

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