Unterschied zwischen 'object', {} und Object in TypeScript
Versuche herauszufinden, was der Unterschied zwischen diesen 2 Typen in TypeScript ist:
foo: objectund
bar: {}und type: Object ?
Beispiel: Versuch, einem object die Variable zuzuweisen, die eigentlich die Kopfzeileninformationen für eine Anfrage verarbeiten soll:
headers: object;
Ergibt einen Fehler:
Der Typ 'object' kann nicht '{ [key: string]: string }' zugewiesen werden.
Die gleiche Bedingung tritt auf, wenn headers: {} verwendet wird, was zu dem Schluss führt, dass {} etwas weniger strenge Anforderungen hat.
Antwort #1
TypeScript hat drei verwirrende Typen: {}, Object und object. Sie können undefined oder null keinem dieser Typen zuweisen, außer wenn die strictNullChecks-Compileroption deaktiviert ist.
{}
{} enthält nicht-nullbare Werte, das heißt alle Werte außer undefined und null. Beachten Sie, dass {} sich nicht auf Objekte ohne Eigenschaften bezieht.
Objekt
Object enthält Werte mit gemeinsamen eingebauten Instanz-Eigenschaften (constructor, hasOwnProperty, isPrototypeOf, propertyIsEnumerable, toLocaleString, toString und valueOf). Es ist strenger als {}, da es einige eingebaute Eigenschaften erfordert. Zum Beispiel können undefined, null und { toString() { return 1; } } nicht Object zugewiesen werden (vgl. @golmschenk Kommentar).
Objekt
object enthält nicht-primitives Werte, das heißt Werte, die nicht vom Typ Undefined, Null, Boolean, Number, BigInt, String oder Symbol sind. object wurde in TypeScript 2.2 eingeführt.
Also :
const x: {} = {};
const y: Object = {};
const z: object = {};
let headers: { [key: string]: string };
headers = x; // okay: {} is assignable to { [key: string]: string }
headers = y; // error: Object is not assignable to { [key: string]: string }
headers = z; // error: object is not assignable to { [key: string]: string }
Antwort #2
Das folgende Beispiel zeigt, wie sich verschiedene Objekttypen unterschiedlich verhalten:
var o: object;
o = { prop: 0 }; // OK
o = []; // OK
o = 42; // Error
o = "string"; // Error
o = false; // Error
o = null; // Error
o = undefined; // Error
var p: {}; // or Object
p = { prop: 0 }; // OK
p = []; // OK
p = 42; // OK
p = "string"; // OK
p = false; // OK
p = null; // Error
p = undefined; // Error
var q: { [key: string]: any };
q = { prop: 0 }; // OK
q = []; // OK
q = 42; // Error
q = "string"; // Error
q = false; // Error
q = null; // Error
q = undefined; // Error
var r: { [key: string]: string };
r = { prop: 'string' }; // OK
r = { prop: 0 }; // Error
r = []; // Error
r = 42; // Error
r = "string"; // Error
r = false; // Error
r = null; // Error
r = undefined; // Error
Damit können wir sagen:
{}, das dem TypObjectentspricht, ist am wenigsten spezifisch. Sie können Objekte, Arrays und Primitive ihm zuweisen.objectist spezifischer und ähnlich wie{ [key: string]: any }. Sie können Objekte und Arrays darauf zuweisen, aber keine primitiven Werte.{ [key: string]: string }ist das spezifischste, das keine primitiven Typen, Arrays oder Objekte mit einem Nicht-String-Wert zugewiesen werden darf.
Link zum TypeScript-Spielplatz
