Apakah Filescript saat ini (atau ada rencana untuk) mendukung operator navigasi yang aman dari?.
yaitu:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
Juga, apakah ada nama yang lebih umum untuk operator ini (sangat sulit untuk google).
typescript
Marty Pitt
sumber
sumber
property ?? property2
, tetapi jika Anda mencobaproperty.company ?? property1.company
danproperty
null, Anda akan mendapatkanNullReferenceException
Jawaban:
Pembaruan : didukung pada TypeScript 3.7 dan disebut Chaining opsional : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Saya tidak dapat menemukan referensi apa pun di spesifikasi bahasa TypeScript .
Sejauh apa yang memanggil operator ini di CoffeeScript, itu disebut operator eksistensial (khusus, "varian accessor" dari operator eksistensial).
Dari dokumentasi CoffeeScript tentang Operator :
Jadi, varian accessor dari operator eksistensial tampaknya menjadi cara yang tepat untuk merujuk ke operator ini; dan TypeScript saat ini tidak muncul untuk mendukungnya (walaupun orang lain telah menyatakan keinginan untuk fungsi ini ).
sumber
Tidak sebagus satu? Tapi itu berfungsi:
Anda dapat menggunakan sebanyak && sebanyak yang Anda suka:
sumber
Ini didefinisikan dalam spesifikasi ECMAScript Optional Chaining, jadi kita mungkin harus merujuk ke chaining opsional ketika kita membahas ini. Kemungkinan implementasi:
Yang panjang dan pendek dari yang satu ini adalah bahwa tim TypeScript sedang menunggu spesifikasi ECMAScript untuk diperketat, sehingga implementasinya dapat menjadi non-breaking di masa depan. Jika mereka mengimplementasikan sesuatu sekarang, itu akan berakhir membutuhkan perubahan besar jika ECMAScript mendefinisikan ulang spesifikasi mereka.
Lihat Spesifikasi Rantai Opsional
Di mana sesuatu tidak akan pernah menjadi JavaScript standar, tim TypeScript dapat menerapkan sesuai keinginan mereka, tetapi untuk penambahan ECMAScript di masa depan, mereka ingin mempertahankan semantik bahkan jika mereka memberikan akses awal, seperti yang mereka miliki untuk banyak fitur lainnya.
Potongan pendek
Jadi semua operator funky JavaScripts tersedia, termasuk jenis konversi seperti ...
Solusi Manual
Tapi kembali ke pertanyaan. Saya punya contoh tumpul tentang bagaimana Anda dapat melakukan hal serupa di JavaScript (dan karena itu TypeScript) meskipun saya jelas tidak menyarankan itu adalah anggun sebagai fitur yang benar-benar Anda cari.
Jadi jika
foo
iniundefined
hasilnya adalahundefined
dan jikafoo
didefinisikan dan memiliki properti bernamabar
yang memiliki nilai, hasilnya adalah nilai itu.Saya memberi contoh di JSFiddle .
Ini terlihat cukup samar untuk contoh yang lebih panjang.
Fungsi Rantai
Jika Anda putus asa untuk versi yang lebih pendek sementara spesifikasinya masih tinggi, saya menggunakan metode ini dalam beberapa kasus. Ini mengevaluasi ekspresi dan mengembalikan default jika rantai tidak dapat dipenuhi atau berakhir nol / tidak terdefinisi (perhatikan
!=
ini penting di sini, kami tidak ingin menggunakan!==
karena kami ingin sedikit juggling positif di sini).sumber
(this.loop || {}).nativeElement
mengatakanProperty 'nativeElement' does not exist on type '{}'. any
this.loop
typeof angular.io/api/core/ElementRef{}
, atau 2) menggunakan pernyataan tipe untuk membungkam kompiler.foo
adalah objek berguna yang sebenarnya:(foo || {}).bar
umumnya tidak akan dikompilasi dalam naskah karena{}
tidak akan sama denganfoo
. Itulah masalah yang ingin dihindari oleh solusi @ VeganHunter.Perbarui: Ya didukung sekarang!
Itu baru saja dirilis dengan TypeScript 3.7: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
Ini disebut perangkaian opsional : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
Dengan itu sebagai berikut:
setara dengan:
Jawaban lama
Ada permintaan fitur terbuka untuk ini di github di mana Anda dapat menyuarakan pendapat / keinginan Anda: https://github.com/Microsoft/TypeScript/issues/16
sumber
Sunting 13 November 2019!
Pada 5 November 2019, TypeScript 3.7 telah dikirimkan dan sekarang mendukung
?.
operator perangkaian opsional 🎉🎉🍾🍾🎉 !!!https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Hanya Untuk Tujuan Sejarah:
Sunting: Saya telah memperbarui jawabannya berkat komentar fracz.
TypeScript 2.0 dirilis
!.
Ini tidak sama dengan?.
(Safe Navigator di C #)Lihat jawaban ini untuk lebih jelasnya:
https://stackoverflow.com/a/38875179/1057052
Ini hanya akan memberi tahu kompiler bahwa nilainya tidak nol atau tidak terdefinisi. Ini tidak akan memeriksa apakah nilainya nol atau tidak terdefinisi.
Operator pernyataan TypeScript Non-null
sumber
?
karena itu menegaskan bahwa nilainya didefinisikan.?
diharapkan gagal / mengevaluasi secara diam-diam ke false. Ngomong-ngomong, senang tahu.Elvis (?.) Operator Chaining Opsional didukung dalam TypeScript 3.7.
Anda dapat menggunakannya untuk memeriksa nilai nol:
cats?.miows
mengembalikan nol jika kucing nol atau tidak terdefinisi.Anda juga dapat menggunakannya untuk pemanggilan metode opsional:
cats.doMiow?.(5)
akan memanggil doMiow jika ada.Akses properti juga mungkin:
cats?.['miows']
.Referensi: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
sumber
?:
. Apakah Anda punya referensi?Operator
?.
tidak didukung di TypeScript versi 2.0 .Jadi saya menggunakan fungsi berikut:
penggunaannya terlihat seperti ini:
plus, Anda dapat menetapkan nilai default:
Ini bekerja sangat baik dengan IntelliSense di Visual Studio.
sumber
elvis<T>
;-)Akhirnya di sini!
Berikut ini beberapa contoh:
Tetapi itu tidak bekerja persis sama dengan asumsi Anda.
Alih-alih mengevaluasi
untuk potongan kode kecil ini kita semua terbiasa menulis
sebenarnya dievaluasi untuk
yang bekerja untuk semua nilai falsey seperti string kosong, 0 atau false.
Saya hanya tidak memiliki penjelasan mengapa mereka tidak mengkompilasinya
foo == null
sumber
Kami menciptakan metode util ini saat bekerja pada Phonetradr yang dapat memberi Anda akses tipe-aman ke properti-properti yang dalam dengan Typescript:
sumber
return this.entry.fields.featuredImage.fields.file.url;
Saya biasanya tidak merekomendasikan pendekatan ini (hati-hati karena masalah kinerja), tetapi Anda dapat menggunakan operator spread untuk menduplikasi objek yang dangkal, yang kemudian dapat Anda akses ke properti.
Ini berfungsi karena jenis 'nama depan' adalah 'diperbanyak' melalui.
Saya akan menggunakan ini paling sering ketika saya memiliki
find(...)
ekspresi yang dapat mengembalikan nol dan saya membutuhkan satu properti dari itu:Mungkin ada beberapa kasus tepi dengan cara jenis naskah menyimpulkan jenis dan ini tidak akan dikompilasi, tetapi ini umumnya akan bekerja.
sumber
Ini disebut perangkaian opsional dan Ada di dalam Script 3.7
sumber
Seperti dijawab sebelumnya, saat ini masih dipertimbangkan tetapi sudah mati di air selama beberapa tahun sekarang.
Berdasarkan jawaban yang ada, inilah versi manual paling ringkas yang dapat saya pikirkan:
jsfiddle
Secara diam-diam gagal pada kesalahan properti yang hilang. Itu kembali ke sintaks standar untuk menentukan nilai default, yang dapat dihilangkan sepenuhnya juga.
Meskipun ini berfungsi untuk kasus-kasus sederhana, jika Anda memerlukan hal-hal yang lebih kompleks seperti memanggil fungsi dan kemudian mengakses properti pada hasilnya, maka kesalahan lainnya juga ditelan. Desain yang buruk.
Dalam kasus di atas, versi yang dioptimalkan dari jawaban lain yang diposting di sini adalah opsi yang lebih baik:
jsfiddle
Contoh yang lebih kompleks:
Anda juga dapat pergi ke arah lain dan menggunakan sesuatu seperti Lodash '
_.get()
. Itu ringkas, tetapi kompiler tidak akan dapat menilai validitas properti yang digunakan:sumber
Belum (per September, 2019), tetapi karena "operator navigasi yang aman" sekarang pada Tahap 3 , itu sedang dilaksanakan di TypeScript.
Tonton masalah ini untuk pembaruan:
https://github.com/microsoft/TypeScript/issues/16
Beberapa mesin memiliki implementasi awal:
JSC: https://bugs.webkit.org/show_bug.cgi?id=200199
V8: https://bugs.chromium.org/p/v8/issues/detail?id=9553
SM: https://bugzilla.mozilla.org/show_bug.cgi?id=1566143
(via https://github.com/tc39/proposal-optional-chaining/issues/115#issue-475422578 )
Anda dapat menginstal plugin untuk mendukungnya sekarang:
Di tsconfig.json Anda:
Saya berharap jawaban ini kedaluwarsa dalam 6 bulan ke depan, tetapi semoga ini akan membantu seseorang untuk sementara waktu.
sumber
_.get(obj, 'address.street.name')
berfungsi bagus untuk JavaScript di mana Anda tidak memiliki tipe. Tetapi untuk TypeScript kita membutuhkan operator Elvis yang asli!sumber