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']);
