Typoskript: Index Signatur fehlt in der Art
Möchte ich MyInterface.dic
wie ein Wörterbuch name: value
, ich definiere es wie folgt:
interface MyInterface {
dic: { [name: string]: number }
}
Nun habe ich eine Funktion erstellen, die wartet auf meine Art:
function foo(a: MyInterface) {
...
}
Und der Eingang:
let o = {
dic: {
'a': 3,
'b': 5
}
}
Erwarte ich foo(o)
richtig zu sein, aber der compiler ist fallend:
foo(o) //Typescript error: Index signature is missing in type { 'a': number, 'b': number }
Ich weiß, es ist ein mögliches casting: let o: MyInterface = { ... }
die den trick tun, aber die Frage ist, warum Typoskript ist nicht zu erkennen, mein Typ?
Extra: funktioniert gut, wenn o
deklariert ist inline:
foo({
dic: {
'a': 3,
'b': 5
}
})
- Ich bin auf der Suche nach Antworten auf diese: github.com/DefinitelyTyped/DefinitelyTyped/issues/24469
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass wenn der Typ abgeleitet ist, dann der Typ von
o
ist:Das ist nicht das gleiche wie
{ dic: { [name: string]: number } }
. Kritisch, mit der oberen Signatur-du bist nicht erlaubt, etwas zu tun, wieo.dic['x'] = 1
. Mit der 2. Unterschrift Sie sind.Sind Sie gleichwertig Typen zur Laufzeit (in der Tat, Sie sind genau die gleiche Wert), aber ein großer Teil der Niederschrift der Sicherheit kommt von der Tatsache, dass diese nicht die gleichen, und es wird nur lassen Sie sich behandeln eines Objekts als ein Wörterbuch, wenn er weiß, es ist explizit gedacht als eine. Dies ist, was verhindert, dass Sie versehentlich Lesen und schreiben völlig nicht-existent Eigenschaften auf Objekte.
Die Lösung ist, um sicherzustellen, Typoskript, weiß, dass es bestimmt ein Wörterbuch. Das bedeutet:
Explizit die Bereitstellung einer Art irgendwo, dass man sagt, es ist ein Wörterbuch:
let o: MyInterface
Behaupten, dass es ein Wörterbuch inline:
let o = { dic: <{ [name: string]: number }> { 'a': 1, 'b': 2 } }
Sicherstellen, es ist der erste Typ, Typoskript bedeutet für Sie:
foo({ dic: { 'a': 1, 'b': 2 } })
Wenn es ist ein Fall, wo Typoskript denkt, es ist ein normales Objekt mit zwei Eigenschaften, und dann versuchen, es später zu benutzen als ein Wörterbuch, es werden unzufrieden.
o.dic.x
o.dic['x'] = 1
). Beispiel aktualisiert.[key: string]: string | number
aber es werfen kann[key: string]: any
trotz einer Schnittstelle nur mit strings und zahlen