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
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.
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.