Letra de imprenta: void tipo de retorno convertido a cualquier tipo?

votos
17

Me parece que no será capaz de comprender por qué el siguiente código de error no plantea:

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

Digo claramente que el tipo debe ser un conjunto de funciones que devuelven void, sin embargo empujo hay una función que devuelve una stringy sin embargo, el compilador no se queja. Si cambio de la definición de rga

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

El compilador comienza a quejarse.

Es esto un error o se trata de cómo se supone que el tipo de retorno void trabajar (es decir, todo vale si voidse utiliza, básicamente, lo que es lo mismo que el tipo de retorno any)?

Publicado el 06/10/2012 a las 17:34
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
17

Esto es por diseño (Voy a explicar por qué es un buen diseño en breve). La especificación dice (en la sección 3.6.3, abreviada para mayor claridad):

Un tipo S se puede asignar a un tipo T, y T es asignable a partir de S, si uno de los siguientes es verdadero ...

  • S y T son los tipos de objetos y, para cada miembro de M en T, uno de lo siguiente es cierto:

    • M es una llamada, construir o firma de índice y S contiene una llamada, construir o el índice de la firma N donde

      • el tipo de resultado de M es nulo, o el tipo de resultado de N es asignable a la de M.

En este caso, estamos probando si () => stringes asignable a () => void. Así que, o stringtiene que ser asignable a void(no lo es), o voidtiene que ser void(es).


En efecto, la regla aquí es que se le permite tirar el valor de retorno , lo cual es consistente con la forma por ejemplo C ++ trata voiden la resolución de la plantilla.

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?

Cuando limitamos el tipo de changeser (widget) => void, lo estamos haciendo de manera que se puede pasar decrementWidgetHeightcomo segundo argumento a pesar de que tiene un valor de retorno, pero todavía asegurándose de que cuando escribimos el cuerpo de applyToManyWidgets, no utilizamos el accidente valor de retorno changeen cualquier lugar.

Tenga en cuenta que voidsigue siendo diferente de anyporque esto es inadmisible:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Respondida el 06/10/2012 a las 22:06
fuente por usuario

votos
0

Eso se ve como un insecto. Usted debe abrir un nuevo elemento de trabajo para la emisión

Respondida el 06/10/2012 a las 18:38
fuente por usuario

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