'tidak dikenal' vs 'apa saja'


190

TypeScript 3.0 memperkenalkan unknowntipe, menurut wiki mereka:

tidak dikenal sekarang menjadi nama jenis yang dicadangkan, karena sekarang merupakan tipe bawaan. Bergantung pada tujuan penggunaan yang tidak diketahui yang Anda inginkan, Anda mungkin ingin menghapus deklarasi sepenuhnya (mendukung jenis yang tidak dikenal yang baru diperkenalkan), atau mengganti namanya menjadi sesuatu yang lain.

Apa perbedaan antara unknowndan any? Ketika kita harus menggunakan unknownlebih any?

Jawaban:


235

Anda dapat membaca lebih lanjut tentang unknowndi PR atau pengumuman RC , tapi inti dari itu adalah:

[..] tidak diketahui yang merupakan jenis-aman dari apa pun. Apa pun dapat ditetapkan untuk tidak diketahui, tetapi tidak diketahui tidak dapat ditetapkan untuk apa pun kecuali dirinya sendiri dan apa pun tanpa pernyataan jenis atau penyempitan berbasis aliran kontrol. Demikian juga, tidak ada operasi yang diizinkan pada yang tidak diketahui tanpa terlebih dahulu menegaskan atau mempersempit ke jenis yang lebih spesifik.

Beberapa contoh:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

Penggunaan yang disarankan adalah:

Seringkali kita ingin menggambarkan tipe yang paling tidak mampu dalam TypeScript. Ini berguna untuk API yang ingin memberi sinyal "ini bisa berupa nilai apa pun, jadi Anda harus melakukan beberapa jenis pemeriksaan sebelum menggunakannya". Ini memaksa pengguna untuk secara aman mengintrospeksi nilai yang dikembalikan.


36
Siapa pun yang datang dari latar belakang C # anyadalah suka dynamicdan unknownsuka object. Saya suka unknownkarena lebih aman. Namun nama yang membingungkan.
nawfal

1
Saya tidak tahu bahwa ini adalah adil untuk membandingkan unknowndan object@nawfal meskipun saya pikir saya melihat apa yang Anda dapatkan dari segi contravariance dan covariance (mis. Objek apa pun dapat ditugaskan untuk mengetik objectmeskipun untuk unknownobjek atau primitif dapat ditugaskan - Demikian pula unknowndapat ditugaskan ke anyatau sendiri dan objectdapat ditugaskan ke dynamicatau sendiri). Di samping catatan saya tidak jelas mengapa dokumen TS disebut unknownsebagai tipe teratas karena tidak benar-benar mengandung semua tipe ¯_ (ツ) _ / ¯
Jordan

38

Perbedaan antara tidak dikenal dan apa pun digambarkan sebagai:

Seperti halnya any, nilai apa pun dapat diberikan unknown; Namun, tidak seperti any, Anda tidak dapat mengakses properti apa pun pada nilai dengan tipe tersebut unknown, Anda juga tidak dapat memanggil / membangunnya. Selain itu, nilai tipe unknownhanya dapat ditetapkan ke unknownatau any.

Untuk menjawab pertanyaan Anda kapan sebaiknya Anda menggunakan unknownlebih dari any:

Ini berguna untuk API yang ingin memberi sinyal "ini bisa berupa nilai apa pun, jadi Anda harus melakukan beberapa jenis pemeriksaan sebelum menggunakannya". Ini memaksa pengguna untuk secara aman mengintrospeksi nilai yang dikembalikan.

Lihatlah pengumuman TypeScript 3.0 untuk contoh tipe yang memeriksa variabel tipe unknowndan penjelasan yang lebih terperinci.


21

any Tipe:

The anyTipe mewakili semua kemungkinan nilai JS. Setiap jenis ditugaskan untuk mengetik any. Oleh karena itu tipe anyini adalah supertipe universal dari sistem tipe. Compiler TS akan memungkinkan operasi apa pun pada nilai yang diketik any. Sebagai contoh:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

Dalam banyak kesempatan ini terlalu lunak untuk kompiler TS. yaitu itu akan memungkinkan operasi yang bisa diketahui menghasilkan kesalahan runtime.

unknown Tipe:

The unknownTipe mewakili (seperti any) semua kemungkinan nilai JS. Setiap jenis ditugaskan untuk mengetik unknown. Oleh karena itu tipe unknownadalah supertipe universal lain dari sistem tipe (bersama any). Namun, kompiler TS tidak akan mengizinkan operasi pada nilai yang diketik unknown. Selain itu, unknowntipe ini hanya dapat ditetapkan untuk tipe tersebut any. Contoh akan memperjelas ini:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.