Typescript: Die Typzusicherung für Zeichenfolgenliterale funktioniert nicht mehr

Erstellt am 12. Sept. 2016  ·  3Kommentare  ·  Quelle: microsoft/TypeScript

TypeScript-Version: 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

Wahrscheinlich im Zusammenhang mit: https://github.com/Microsoft/TypeScript/pull/10676

Bug Fixed

Hilfreichster Kommentar

@wallverb Einverstanden, es wäre schön, eine Syntaxform zu haben, um anzuzeigen, dass Sie keine Erweiterung wünschen, ohne den Typ explizit angeben zu müssen. Aus Gründen der Abwärtskompatibilität sollten wir jedoch zulassen, dass Typzusicherungen diese Bedeutung haben.

Alle 3 Kommentare

Ja, dies hängt mit # 10676 zusammen. Bisher hatte ein Zeichenfolgenliteral nur in bestimmten "Literalkontexten" (z. B. nach einer Typzusicherung) einen Literaltyp, und wir verwendeten nur den genauen Typ eines Ausdrucks als abgeleiteten Typ einer Objektliteraleigenschaft. String-Literale haben jetzt immer Literaltypen, und stattdessen erweitern wir die Typen, wenn sie auf veränderbare Positionen (z. B. Objektliteraleigenschaften) geschlossen werden. In Ihrem Beispiel haben die Typzusicherungen also keine Auswirkung (a), weil die Zeichenfolgenliterale bereits Literaltypen sind, und (b) weil wir das Ergebnis des gesamten Ausdrucks nach der Typzusicherung erweitern.

Zur besseren Abwärtskompatibilität könnten wir in Betracht ziehen, einen abgeleiteten Typ nicht zu erweitern, wenn der Initialisiererausdruck eine Typzusicherung ist. Was wäre der Sinn der Typbehauptung sonst?

@ahejlsberg Danke für die Antwort.

Es wäre großartig, wenn Sie in Betracht ziehen könnten, einen abgeleiteten Typ nicht zu erweitern, wenn der Initialisiererausdruck eine Typzusicherung ist - und stimmen Sie zu - das ist der Punkt der Typzusicherung :)

Ein weiterer häufiger Fall, der ohne ihn nicht mehr funktioniert, ist:

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

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

test(style)

Syntax für Literaltypen https://github.com/Microsoft/TypeScript/issues/10195 würde helfen - aber ich bin mir nicht sicher, ob es jemals Realität werden wird

Vielen Dank für alles

@wallverb Einverstanden, es wäre schön, eine Syntaxform zu haben, um anzuzeigen, dass Sie keine Erweiterung wünschen, ohne den Typ explizit angeben zu müssen. Aus Gründen der Abwärtskompatibilität sollten wir jedoch zulassen, dass Typzusicherungen diese Bedeutung haben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen