typescript - Avvik mellom å sende navngitt objekt og anonymt objekt i typekontroll


Vurder følgende kode

interface Config {
    label?: string;
    width?: number;
}

function printLabel(labelledObj: Config) {
    console.log(labelledObj.label);
}

let myObj = {not_in_interface: 10, label: "Size 10 Object"};

// No error
printLabel(myObj);

// Will run into error  Argument of type '{ not_in_interface: number; label: string; }' is not assignable to parameter of type 'Config'
printLabel({not_in_interface: 10, label: "Size 10 Object"});

Hva er årsaken til avviket?

Det ser ut som om anonymt objekt utløser excess property checking mens navngitt objekt ikke gjør det.

Svar #1

TypeScript sjekker bare for overflødige egenskaper der et objektlitteral erklæres (som du nevnte i spørsmålet ditt). TypeScript-dokumentasjonen beskriver denne sjekken: (Du kan også gjerne sjekke hele spesifikasjonen her.)

TypeScript 1.6 håndhever strengere kontroller av tildeling av objekter for å oppdage overskytende eller feilstavede egenskaper. Spesielt, når en ny objektliteral tildeles en variabel eller sendes som et argument for en ikke-tom måletype, er det en feil hvis objektliteralet spesifiserer egenskaper som ikke finnes i måletype.

Så hvorfor denne oppførselen? Kort sagt, i noen brukstilfeller vil du tillate ekstra egenskaper når du passerer rundt objekter, og i andre brukstilfeller vil du ikke. For eksempel ville det være trist om vår printWeightInPounds-funksjon nedenfor ikke aksepterte vårt Dog-objekt:

interface Animal { weight: number; }
interface Dog extends Animal { breed: string; }

const myDog: Dog = { weight: 100, breed: "Poodle" }; // a big poodle!
printWeightInPounds(myDog);

Å være streng og ikke tillate ekstra egenskaper i alle tilfeller ville forby mye legitim kode. Men frivillig strenghet kunne være en god ting noen steder. Det finnes forslag om å ha en "Eksakt type"-funksjon som vil tillate deg å velge å bare sende identiske typer rundt. Det er fortsatt til diskusjon.

Relaterte artikler