Forskjellen mellom 'object', {} og Object i TypeScript
Prøver å finne ut forskjellen mellom disse to typene i TypeScript:
foo: objectog
bar: {}og type: Object ?
Eksempel: prøve å tilordne et objekt til variabelen som skal håndtere overskriftsinformasjon for en forespørsel:
headers: object;
Resulterer i en feil:
Type 'object' kan ikke tildeles til '{ [key: string]: string }'.
Den samme tilstanden oppstår hvis man bruker headers: {}, noe som fører til konklusjonen at {} har noen litt mindre strenge krav.
Svar #1
TypeScript har tre forvirrende typer: {}, Object og object. Du kan ikke tilordne undefined eller null til noen av disse typene med mindre strictNullChecks kompilatoralternativet er deaktivert.
{}
{} inneholder ikke-null verdier, det vil si alle verdier unntatt undefined og null. Merk at {} ikke refererer til objekter uten egenskaper.
Objekt
Object inneholder verdier med vanlige innebygde instans-egenskaper (constructor, hasOwnProperty, isPrototypeOf, propertyIsEnumerable, toLocaleString, toString og valueOf). Det er strengere enn {} siden det krever noen innebygde egenskaper. For eksempel kan undefined, null og { toString() { return 1; } } ikke tildeles Object (jf. @golmschenk sin kommentar).
objekt
object inneholder ikke-primitive verdier, det vil si verdier som ikke er av typen Undefined, Null, Boolean, Number, BigInt, String eller Symbol. object ble introdusert i TypeScript 2.2.
Dermed :
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 }
Svar #2
Følgende eksempel viser hvordan forskjellige typer objekter oppfører seg forskjellig:
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
Med det kan vi si:
{}som er det samme som typenObject, er den minst spesifikke. Du kan tilordne objekter, arrayer og primitive verdier til den.objecter mer spesifikt og ligner på{ [key: string]: any }. Du kan tilordne objekter og matriser til det, men ikke primitive typer.{ [key: string]: string }er den mest spesifikke, som ikke tillater at noen primitive typer, arrayer eller objekter med en ikke-streng verdi tildeles til den.
Lenke til TypeScript-lekeplass
