Typescript: La aserción de tipo para literales de cadena dejó de funcionar

Creado en 12 sept. 2016  ·  3Comentarios  ·  Fuente: microsoft/TypeScript

Versión de TypeScript: 2.1.0-dev.20160912

Código

// A *self-contained* demonstration of the problem follows...
const types = {
    test: <'test'>'test',
    test2: 'test2' as 'test2'
} // type: {test: string, test2:string}

let a = <'test'>'test'  // type string

Probablemente relacionado con: https://github.com/Microsoft/TypeScript/pull/10676

Bug Fixed

Comentario más útil

@wallverb De acuerdo, sería bueno tener _alguna_ forma de sintaxis para indicar que no desea ampliar sin tener que indicar explícitamente el tipo. Pero independientemente, por razones de compatibilidad con versiones anteriores, deberíamos permitir que las afirmaciones de tipo tengan ese significado.

Todos 3 comentarios

Sí, esto está relacionado con # 10676. Anteriormente, un literal de cadena tendría un tipo literal solo en ciertos "contextos literales" (como después de una aserción de tipo) y solo usaríamos el tipo exacto de una expresión como el tipo inferido de una propiedad literal de objeto. Ahora, los literales de cadena siempre tienen tipos literales y, en su lugar, _anchamos_ tipos cuando se infieren para ubicaciones mutables (como propiedades de objetos literales). Entonces, en su ejemplo, las aserciones de tipo no tienen efecto (a) porque los literales de cadena ya son de tipos literales y (b) porque ampliamos el resultado de toda la expresión después de la aserción de tipo.

Para una mejor compatibilidad con versiones anteriores, podríamos considerar _no_ ampliar un tipo inferido cuando la expresión del inicializador es una aserción de tipo. Después de todo, ¿cuál sería el punto de la afirmación de tipo de otra manera?

@ahejlsberg Gracias por la respuesta.

Sería genial si pudiera considerar _no_ ampliar un tipo inferido cuando la expresión del inicializador es una aserción de tipo, y de acuerdo, ese es el punto de la aserción de tipo :)

Otro caso común que dejará de funcionar sin él es:

function test(style: { align: 'left' | 'right', size: number }) {
}

const style = {
    align: 'left' as 'left',
    size: 5
}

test(style)

La sintaxis para tipos literales https://github.com/Microsoft/TypeScript/issues/10195 ayudaría, pero no estoy seguro de si alguna vez se convertirá en una realidad

Muchas gracias por todo

@wallverb De acuerdo, sería bueno tener _alguna_ forma de sintaxis para indicar que no desea ampliar sin tener que indicar explícitamente el tipo. Pero independientemente, por razones de compatibilidad con versiones anteriores, deberíamos permitir que las afirmaciones de tipo tengan ese significado.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

siddjain picture siddjain  ·  3Comentarios

fwanicka picture fwanicka  ·  3Comentarios

Antony-Jones picture Antony-Jones  ·  3Comentarios

uber5001 picture uber5001  ·  3Comentarios

DanielRosenwasser picture DanielRosenwasser  ·  3Comentarios