Dattiloscritto: void tipo di ritorno convertito a qualsiasi tipo?

voti
17

Mi sembra di essere non in grado di comprendere il motivo per cui il seguente codice non genera errore:

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

Premetto chiaramente che il tipo deve essere una serie di funzioni che restituiscono void, tuttavia mi ci spingere una funzione che restituisce un stringeppure il compilatore non si lamenta. Se cambio la definizione di rga

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

Il compilatore inizia a lamentarsi.

Questo è un bug o è come si suppone che il tipo di ritorno vuoto al lavoro (cioè tutto è permesso se voidviene utilizzato, in pratica rendendo lo stesso tipo di ritorno any)?

È pubblicato 06/10/2012 alle 17:34
fonte dall'utente
In altre lingue...                            


2 risposte

voti
17

Ciò è di progettazione (vi spiego perché è un buon design a breve). Le specifiche dice (nella sezione 3.6.3, abbreviata per chiarezza):

Un tipo S è assegnabile a un tipo T, e T è assegnabile da S, se una delle seguenti condizioni ...

  • S e T sono tipi di oggetti e, per ciascun membro M in T, una delle seguenti condizioni:

    • M è una chiamata, costrutto o firma indice e S contiene una chiamata, costrutto o firma indice N dove

      • il tipo di risultato di M è vuoto, o il tipo di risultato di N è assegnabile a quello di M.

In questo caso, stiamo testando se () => stringè assegnabile a () => void. Quindi, o stringdeve essere assegnabili a void(non lo è), o voiddeve essere void(è).


In effetti, la regola qui è che si è permesso di buttare via il valore di ritorno , che è coerente con il modo ad esempio C ++ tratta voidnella risoluzione dei template.

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?

Quando abbiamo limitare il tipo di changeessere (widget) => void, stiamo facendo in modo che è possibile passare decrementWidgetHeightcome secondo argomento, anche se ha un valore di ritorno, ma ancora fare in modo che quando scriviamo il corpo di applyToManyWidgets, non usiamo accidentalmente il il valore di ritorno changeda nessuna parte.

Si noti che voidè ancora diverso da quello any, perché questo è non consentiti:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Risposto il 06/10/2012 a 22:06
fonte dall'utente

voti
0

Che sembra come un insetto. Si dovrebbe aprire un nuovo elemento di lavoro per il rilascio

Risposto il 06/10/2012 a 18:38
fonte dall'utente

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