Typescript-grensesnitt med dynamiske nøkler som utvider Object


I TypeScript klarer jeg ikke å la grensesnittet mitt utvide Object når indekser brukes (nøkkel som streng).

Hvis jeg ikke utvider Object, fungerer det fint, men IntelliSense gir ikke forslag for Object.hasOwnProperty()-metoden.

interface MyObject extends Object {
 [key: string] : string;
}

Overstående kode gir meg kompileringsfeil som: "Egenskapen 'hasOwnProperty' av typen '(v: string) => boolean' kan ikke tildeles til strengindekstype 'string'."

Senere i koden vil jeg gjerne bruke en variabel av typen MyObject for å sjekke om den inneholder en bestemt nøkkel ved å bruke hasOwnProperty-metoden til Object.

Svar #1

Du trenger ikke å utvide Object for å ha hasOwnProperty-metoden. Siden alle objekter arver Object, vil denne metoden eksistere på enhver instans av grensesnittet.

interface MyObject {
    [key: string]: string;
}

var v: MyObject = {
    "foo" : "1"
}
v.hasOwnProperty("foo");

Indekssignaturen betyr vanligvis at alle medlemmene av grensesnittet vil være kompatible med returtypen til indeksen. Du kan omgå dette ved å bruke unionstyper, men du kan fortsatt ikke direkte opprette et slikt objekt uten Object.assign:

type MyObject  = Object & { // Object is useless but we can specify it
    [key: string]: string;
} & { // We can specify other incompatible properties
    required: boolean
}

// We can create an instance with `Object.assign`
var v: MyObject = Object.assign({
    "foo" : "1"
}, {
    required: true
});
v.hasOwnProperty("foo");
console.log(v.required);
console.log(v['bar']); 

Relaterte artikler