Versi TypeScript: 2.1.0-dev.20160912
Kode
// 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
Mungkin terkait dengan: https://github.com/Microsoft/TypeScript/pull/10676
Ya, ini terkait dengan # 10676. Sebelumnya, string literal akan memiliki tipe literal hanya dalam "konteks literal" tertentu (seperti setelah pernyataan tipe) dan kita hanya akan menggunakan tipe ekspresi yang tepat sebagai tipe simpulan dari properti literal objek. Sekarang, string literal selalu memiliki tipe literal dan sebagai gantinya kita _widen_ types ketika mereka disimpulkan untuk lokasi yang bisa berubah (seperti properti literal objek). Jadi, dalam contoh Anda, pernyataan tipe tidak berpengaruh (a) karena literal string sudah merupakan tipe literal dan (b) karena kita memperluas hasil dari seluruh ekspresi setelah pernyataan tipe.
Untuk kompatibilitas mundur yang lebih baik, kita bisa mempertimbangkan _not_ memperluas tipe yang disimpulkan ketika ekspresi penginisialisasi adalah pernyataan tipe. Lagi pula, apa gunanya pernyataan tipe sebaliknya?
@ahejlsberg Terima kasih atas tanggapannya.
Akan sangat bagus jika Anda bisa mempertimbangkan _tidak_ memperluas tipe yang disimpulkan ketika ekspresi penginisialisasi adalah pernyataan tipe - dan setuju - itulah inti dari pernyataan tipe :)
Kasus umum lain yang akan berhenti berfungsi tanpanya adalah:
function test(style: { align: 'left' | 'right', size: number }) {
}
const style = {
align: 'left' as 'left',
size: 5
}
test(style)
Sintaks untuk tipe literal https://github.com/Microsoft/TypeScript/issues/10195 akan membantu - tetapi saya tidak yakin apakah itu akan menjadi kenyataan
Terima kasih banyak untuk semuanya
@ Wallverb Setuju, alangkah baiknya memiliki bentuk sintaks _some_ untuk menunjukkan Anda tidak ingin melebar tanpa harus menyatakan jenisnya secara eksplisit. Namun terlepas dari itu, untuk alasan kompatibilitas mundur kita harus mengizinkan pernyataan tipe memiliki arti itu.
Komentar yang paling membantu
@ Wallverb Setuju, alangkah baiknya memiliki bentuk sintaks _some_ untuk menunjukkan Anda tidak ingin melebar tanpa harus menyatakan jenisnya secara eksplisit. Namun terlepas dari itu, untuk alasan kompatibilitas mundur kita harus mengizinkan pernyataan tipe memiliki arti itu.