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.
