"unbekannt" gegen "beliebig"


189

TypeScript 3.0 führt unknownTyp gemäß seinem Wiki ein:

unbekannt ist jetzt ein reservierter Typname, da es sich jetzt um einen integrierten Typ handelt. Abhängig von Ihrer beabsichtigten Verwendung von unbekannt möchten Sie die Deklaration möglicherweise vollständig entfernen (zugunsten des neu eingeführten unbekannten Typs) oder in etwas anderes umbenennen.

Was ist der Unterschied zwischen unknownund any? Wann sollten wir unknownüber verwenden any?

Antworten:


232

Sie können mehr darüber unknownin der PR- oder RC-Ankündigung lesen , aber das Wesentliche ist:

[..] unbekannt, welches das typsichere Gegenstück zu jedem ist. Alles ist unbekannt zuzuordnen, aber unbekannt ist nichts anderem als sich selbst und jedem ohne Typzusicherung oder eine auf Kontrollfluss basierende Verengung zuzuordnen. Ebenso sind keine Operationen an einem Unbekannten zulässig, ohne zuvor einen spezifischeren Typ zu behaupten oder einzugrenzen.

Ein paar Beispiele:

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

Die empfohlene Verwendung ist:

Es gibt oft Fälle, in denen wir den am wenigsten fähigen Typ in TypeScript beschreiben möchten. Dies ist nützlich für APIs, die signalisieren möchten, dass dies ein beliebiger Wert sein kann. Sie müssen daher eine Art Überprüfung durchführen, bevor Sie ihn verwenden. Dies zwingt Benutzer dazu, zurückgegebene Werte sicher zu überprüfen.


35
Jeder, der aus dem C # -Hintergrund kommt, anyist wie dynamicund unknownist wie object. Ich mag, unknownda es nur typsicherer ist. Verwirrende Namen.
Nawfal

1
Ich weiß nicht, dass dies ein fairer Vergleich unknownund object@nawfal ist, obwohl ich denke, ich sehe, was Sie in Bezug auf die Kontravarianz und Kovarianz erreichen (z. B. kann jedes Objekt dem Typ zugewiesen werden, objectobwohl für unknownjedes Objekt oder Primitiv zugewiesen werden kann - unknownkann in ähnlicher Weise anyoder sich selbst objectzugewiesen werden und könnte sich selbst zugewiesen werden dynamic). unknownNebenbei bemerkt, ich bin mir nicht sicher , warum die TS-Dokumente als Top-Typ bezeichnet werden, da sie nicht wirklich alle Typen enthalten. ¯_ (ツ) _ / ¯
Jordanien

38

Der Unterschied zwischen Unbekanntem und Unbekanntem wird beschrieben als:

Ähnlich wie anyjeder Wert ist zuweisbar unknown; Im Gegensatz dazu anykönnen Sie jedoch weder auf Eigenschaften für Werte mit dem Typ zugreifen unknownnoch diese aufrufen / konstruieren. Weiterhin Werte vom Typ unknownkönnen nur zugewiesen werden , unknownoder any.

Um Ihre Frage zu beantworten, wann Sie unknownover verwenden sollten any:

Dies ist nützlich für APIs, die signalisieren möchten, dass dies ein beliebiger Wert sein kann. Sie müssen daher eine Art Überprüfung durchführen, bevor Sie ihn verwenden. Dies zwingt Benutzer dazu, zurückgegebene Werte sicher zu überprüfen.

In der TypeScript 3.0-Ankündigung finden Sie Beispiele für die Typprüfung einer Typvariablen unknownund eine ausführlichere Erläuterung.


21

any Art:

Der anyTyp repräsentiert alle möglichen JS-Werte. Jeder Typ ist dem Typ zuweisbar any. Daher ist der Typ anyein universeller Supertyp des Typsystems. Der TS-Compiler erlaubt jede Operation mit eingegebenen Werten any. Beispielsweise:

let myVar: any;

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

In vielen Fällen ist dies für den TS-Compiler zu nachsichtig. Das heißt, es werden Operationen zugelassen, von denen wir wissen könnten, dass sie zu einem Laufzeitfehler führen.

unknown Art:

Der unknownTyp repräsentiert (genau wie any) alle möglichen JS-Werte. Jeder Typ ist dem Typ zuweisbar unknown. Daher ist der Typ unknownein weiterer universeller Supertyp des Typsystems (daneben any). Allerdings ist der TS - Compiler nicht erlauben jede Operation auf Werte eingegeben unknown. Darüber hinaus ist der unknownTyp nur dem Typ zuweisbar any. Ein Beispiel wird dies verdeutlichen:

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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.