Typescript: L'assertion de type pour les littéraux de chaîne a cessé de fonctionner

Créé le 12 sept. 2016  ·  3Commentaires  ·  Source: microsoft/TypeScript

Version TypeScript: 2.1.0-dev.20160912

Code

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

Probablement lié à: https://github.com/Microsoft/TypeScript/pull/10676

Bug Fixed

Commentaire le plus utile

@wallverb D'accord, ce serait bien d'avoir _une_ forme de syntaxe pour indiquer que vous ne voulez pas d'élargissement sans avoir à énoncer explicitement le type. Mais quoi qu'il en soit, pour des raisons de compatibilité ascendante, nous devrions permettre aux assertions de type d'avoir cette signification.

Tous les 3 commentaires

Oui, ceci est lié à # 10676. Auparavant, un littéral de chaîne n'avait un type littéral que dans certains «contextes littéraux» (comme après une assertion de type) et nous utiliserions simplement le type exact d'une expression comme type inféré d'une propriété littérale d'objet. Maintenant, les littéraux de chaîne ont toujours des types littéraux et à la place, nous les types _widen_ quand ils sont déduits pour des emplacements mutables (tels que les propriétés littérales d'objet). Ainsi, dans votre exemple, les assertions de type n'ont aucun effet (a) car les chaînes littérales sont déjà de types littéraux et (b) car nous élargissons le résultat de l'expression entière après l'assertion de type.

Pour une meilleure compatibilité ascendante, nous pourrions envisager de ne pas élargir un type inféré lorsque l'expression d'initialisation est une assertion de type. Après tout, quel serait l'intérêt de l'assertion de type autrement?

@ahejlsberg Merci pour la réponse.

Ce serait bien si vous pouviez envisager de ne pas élargir un type inféré lorsque l'expression d'initialisation est une assertion de type - et d'accord - c'est en quelque sorte le point de l'assertion de type :)

Un autre cas courant qui cessera de fonctionner sans cela est:

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

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

test(style)

La syntaxe des types littéraux https://github.com/Microsoft/TypeScript/issues/10195 aiderait - mais je ne suis pas sûr que cela devienne un jour une réalité

Merci beaucoup pour tout

@wallverb D'accord, ce serait bien d'avoir _une_ forme de syntaxe pour indiquer que vous ne voulez pas d'élargissement sans avoir à énoncer explicitement le type. Mais quoi qu'il en soit, pour des raisons de compatibilité ascendante, nous devrions permettre aux assertions de type d'avoir cette signification.

Cette page vous a été utile?
0 / 5 - 0 notes