Ketika melihat kode sumber untuk aturan tslint, saya menemukan pernyataan berikut:
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Perhatikan !
operator setelahnya node.parent
. Menarik!
Saya pertama kali mencoba mengkompilasi file secara lokal dengan versi TS saya yang terinstal (1.5.3). Kesalahan yang dihasilkan menunjuk ke lokasi tepat bang:
$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.
Selanjutnya saya upgrade ke TS terbaru (2.1.6), yang mengkompilasinya tanpa masalah. Jadi sepertinya fitur TS 2.x. Tetapi transpilasi mengabaikan bang sepenuhnya, menghasilkan JS berikut:
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Google fu saya sejauh ini telah mengecewakan saya.
Apa yang dimaksud dengan tanda seru TS, dan bagaimana cara kerjanya?
sumber
console.assert()
pada variabel yang dimaksud sebelum menambahkan!
setelahnya. Karena add!
memberitahu kompiler untuk mengabaikan cek nol, ia mengkompilasi ke noop di javascript. Jadi, jika Anda tidak yakin bahwa variabel tersebut bukan nol, maka lebih baik lakukan pemeriksaan tegas eksplisit.dict.has(key) ? dict.get(key) : 'default';
kompiler TS tidak dapat menyimpulkan bahwaget
panggilan tidak pernah mengembalikan null / undefined.dict.has(key) ? dict.get(key)! : 'default';
mempersempit jenis dengan benar.Jawaban Louis sangat bagus, tetapi saya pikir saya akan mencoba merangkumnya dengan ringkas:
Operator bang memberitahu kompiler untuk sementara waktu mengendurkan batasan "bukan nol" yang mungkin diminta. Ia mengatakan kepada kompiler: "Sebagai pengembang, saya tahu lebih baik daripada Anda bahwa variabel ini tidak boleh nol sekarang".
sumber
var
ataulet
diinisialisasi secara implisitundefined
. Selanjutnya, properti instance kelas dapat dideklarasikan seperti itu, sehinggaclass C { constructor() { this.myVar = undefined; } }
sangat legal. Akhirnya, kait siklus hidup bergantung pada kerangka; misalnya Angular dan React menerapkannya secara berbeda. Jadi kompiler TS tidak dapat diharapkan untuk alasan tentang mereka.