Typescript: A asserção de tipo para literais de string parou de funcionar

Criado em 12 set. 2016  ·  3Comentários  ·  Fonte: microsoft/TypeScript

Versão do 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

Provavelmente relacionado a: https://github.com/Microsoft/TypeScript/pull/10676

Bug Fixed

Comentários muito úteis

@wallverb Concordo, seria bom ter _alguma_ forma de sintaxe para indicar que você não quer o alargamento sem ter que declarar explicitamente o tipo. Mas independentemente, por razões de compatibilidade com versões anteriores, devemos permitir que as afirmações de tipo tenham esse significado.

Todos 3 comentários

Sim, isso está relacionado a # 10676. Anteriormente, um literal de string teria um tipo literal apenas em certos "contextos literais" (como após uma declaração de tipo) e usaríamos apenas o tipo exato de uma expressão como o tipo inferido de uma propriedade literal de objeto. Agora, os literais de string sempre têm tipos literais e, em vez disso, _widen_ tipos quando eles são inferidos para locais mutáveis ​​(como propriedades literais de objeto). Portanto, em seu exemplo, as asserções de tipo não têm efeito (a) porque os literais de string já são de tipos literais e (b) porque ampliamos o resultado de toda a expressão após a asserção de tipo.

Para melhor compatibilidade com versões anteriores, poderíamos considerar _não_ alargar um tipo inferido quando a expressão do inicializador for uma declaração de tipo. Afinal, qual seria o ponto da afirmação de tipo de outra forma?

@ahejlsberg Obrigado pela resposta.

Seria ótimo se você pudesse considerar _não_ alargar um tipo inferido quando a expressão do inicializador é uma afirmação de tipo - e concordo - esse é o ponto da afirmação de tipo :)

Outro caso comum que para de funcionar sem ele é:

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

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

test(style)

Sintaxe para tipos literais https://github.com/Microsoft/TypeScript/issues/10195 ajudaria, mas não tenho certeza se algum dia se tornará realidade

Muito obrigado por tudo

@wallverb Concordo, seria bom ter _alguma_ forma de sintaxe para indicar que você não quer o alargamento sem ter que declarar explicitamente o tipo. Mas independentemente, por razões de compatibilidade com versões anteriores, devemos permitir que as afirmações de tipo tenham esse significado.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

yortus picture yortus  ·  157Comentários

jonathandturner picture jonathandturner  ·  147Comentários

OliverJAsh picture OliverJAsh  ·  242Comentários

RyanCavanaugh picture RyanCavanaugh  ·  205Comentários

chanon picture chanon  ·  138Comentários