Interfață Typescript cu chei dinamice care extinde Object
În TypeScript nu pot să fac ca interfața mea să extindă Object atunci când este folosit un indexer (cheia ca string).
Dacă nu extind Object, atunci funcționează bine, dar IntelliSense nu oferă sugestii pentru metoda Object.hasOwnProperty().
interface MyObject extends Object {
[key: string] : string;
}
Codul de mai sus, primesc o eroare la timpul de compilare astfel: „Proprietatea 'hasOwnProperty' de tip '(v: string) => boolean' nu poate fi atribuită tipului de index string 'string'.”
Mai târziu în cod aș dori să folosesc o variabilă de tip MyObject pentru a verifica dacă conține o cheie anume folosind metoda hasOwnProperty a obiectului.
Răspuns #1
Nu trebuie să extinzi Object pentru a avea metoda hasOwnProperty. Deoarece toate obiectele moștenesc Object, această metodă va exista pe orice instanță a interfeței.
interface MyObject {
[key: string]: string;
}
var v: MyObject = {
"foo" : "1"
}
v.hasOwnProperty("foo");
Semnătura indexului în general înseamnă că toți membrii interfeței vor fi compatibili cu tipul de returnare al indexului. Totuși, poți să ocolești acest lucru folosind tipuri de uniune, dar tot nu poți crea direct un astfel de obiect fără 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']);
