'bilinmiyor' ve 'herhangi bir'


190

TypeScript 3.0 unknown, wiki'lerine göre türü sunar:

bilinmeyen, artık yerleşik bir tür olduğundan ayrılmış bir tür adıdır. Bilinmeyen kullanım amacınıza bağlı olarak, bildirimi tamamen kaldırmak (yeni tanıtılan bilinmeyen türü tercih etmek) veya başka bir şeye yeniden adlandırmak isteyebilirsiniz.

Arasındaki fark nedir unknownve any? Ne zaman kullanmalıyım unknownüzerinde any?

Yanıtlar:


233

Sen hakkında daha fazla bilgi edinebilirsiniz unknowniçinde PR veya RC duyuru , ama bunun özü şudur:

[..] bilinmeyen herhangi biri tip-güvenli muadili. Hiçbir şey bilinmeyene atanabilir, ancak bilinmeyen kendisi dışında ve bir tür iddiası veya kontrol akışı tabanlı daralması olmayan hiçbir şey için atanamaz. Benzer şekilde, bilinmeyen bir şey üzerinde, önce daha spesifik bir tür öne sürülmeden veya daraltılmadan hiçbir işleme izin verilmez.

Birkaç örnek:

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

Önerilen kullanım:

TypeScript'te en az yetenekli türü tanımlamak istediğimiz zamanlar vardır. Bu, "bu herhangi bir değer olabilir, bu yüzden kullanmadan önce bir tür kontrol yapmanız gerekir" sinyalini vermek isteyen API'lar için kullanışlıdır. Bu, kullanıcıları döndürülen değerleri güvenli bir şekilde gözlemlemeye zorlar.


35
C # arka plandan gelen herkes any, gibidir dynamicve unknowngibidir object. Daha unknowngüvenli bir tip olduğu için seviyorum . Yine de kafa karıştırıcı isimler.
nawfal

1
Karşıtlık ve kovaryans açısından ne elde ettiğinizi gördüğüme rağmen , bu karşılaştırmak unknownve object@ nawfal için adil bir şey olduğunu bilmiyorum (örneğin, herhangi bir nesne veya ilkel için atanmış objectolsa da unknownherhangi bir nesne yazılabilir - benzer unknownşekilde anyveya kendisine objectatanabilir dynamicveya kendisine atanabilir ). Bir yan notta, TS belgelerinin neden en unknowniyi tür olarak adlandırıldığından emin değilim, çünkü gerçekten tüm türleri içermiyor ¯_ (ツ) _ / ¯
Ürdün

38

Bilinmeyen ile herhangi biri arasındaki fark şu şekilde tanımlanır:

Daha çok any, herhangi bir değer atanabilir unknown; ancak, aksine any, türdeki değerlerle ilgili herhangi bir özelliğe erişemez ve unknownbunları arayamaz / oluşturamazsınız. Ayrıca, tür değerleri unknownyalnızca unknownveya öğesine atanabilir any.

Kullanmanız gereken ne zaman sorunuza cevap bulmak için unknownüzerinde any:

Bu, "bu herhangi bir değer olabilir, bu yüzden kullanmadan önce bir tür kontrol yapmanız gerekir " sinyalini vermek isteyen API'lar için kullanışlıdır . Bu, kullanıcıları döndürülen değerleri güvenli bir şekilde gözlemlemeye zorlar.

Bir tür değişkenini ve daha ayrıntılı bir açıklamayı denetleyen tür örnekleri için TypeScript 3.0 duyurusuna bakın unknown.


21

any yazın:

anyTip olası tüm JS değerlerini temsil eder. Her tür, türe atanabilir any. Bu nedenle tür any, tür sisteminin evrensel bir süpertipidir. TS derleyici yazılan değerler üzerinde herhangi bir işleme izin verecektir any. Örneğin:

let myVar: any;

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

Birçok durumda bu TS derleyicisine çok yumuşaktır. yani bir çalışma zamanı hatasına yol açabileceğini bildiğimiz işlemlere izin verir.

unknown yazın:

unknownTipi (tıpkı temsil anyolası tüm JS değerlerinin). Her tür, türe atanabilir unknown. Bu nedenle, tür unknown, yazı sisteminin (yanında any) başka bir evrensel süpertipidir . Ancak, TS derleyici olmaz yazdığınız değerler üzerinde herhangi bir işlemi izin unknown. Ayrıca, unknowntür yalnızca türe atanabilir any. Bir örnek bunu açıklığa kavuşturacaktır:

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.