it-swarm.com.de

Die Eigenschaft '0' fehlt im Typ

Ich habe meine Schnittstelle so 

export interface Details {
    Name: [{
        First: string;
        Last: string;
    }];
}   

Ich habe eine beobachtbare Konfigurationsvariable 

Configuration: KnockoutObservable<Details> = ko.observable<Details>();

und ich möchte ihm im Konstruktor einen Wert wie folgt zuweisen: 

config = {
         Name: [{
               First: "ABC",
               Last: "DEF"
            },
            {
               First: "LMN",
               Last: "XYZ"
            }]
        };

this.Configuration(config);

und ich bekomme eine Fehlermeldung: 

Die Eigenschaftstypen 'Name' sind nicht kompatibel und die Eigenschaft '0' fehlt in der Art.

Geben Sie '{First: String; Letzte: String; } [] 'kann nicht dem Typ' [{ Zuerst: string; Letzte: String; }] '

Ich kann die Schnittstelle nicht ändern, da sie an anderer Stelle verwendet wird. Wie kann ich diese Konfigurationsvariable richtig initialisieren?

Danke im Voraus.

13
rkt

Ich bin auf das gleiche Problem gestoßen und bin umgekommen, indem ich die Benutzeroberfläche geändert habe:

    interface Details {
        Name: {
            First: string;
            Last: string;
        }[];
    }

Ich weiß, dass Sie nicht möchten, dass die Benutzeroberfläche geändert wird, aber ich hoffe, dass dies für jeden hilfreich ist, der in dieser Situation ist.

14
RyanA91

Dieser Fehler kann von einer falschen Eingabe eines Arrays herrühren (wie ich es gerade getan habe):

myArray:[]; //Incorrect, results in error message of `Property '0' is missing in type`

myArray: Array<string>; //Correct

myArray: string[]; //Also correct

Der Grund dafür ist, dass geschweifte Klammern ein Tupel in TypeScript und kein Array bezeichnen.

The Docs

8
Greg Gum

In dieser Typdefinition:

interface Details {
  Name: [{
    First: string;
    Last: string;
  }];
}

Name ist zur Kompilierzeit kein Array. Es ist ein Tupel mit einem Element. Tupel in TypeScript dürfen zusätzliche Elemente haben, aber sie dürfen keine fehlenden Elemente enthalten. Als 1-Tupel ist Name im Wesentlichen ein Array, das mindestens ein Element enthalten muss.

In diesem Wert jedoch:

const config = {
  Name: [{
    First: "ABC",
    Last: "DEF"
  },
  {
    First: "LMN",
    Last: "XYZ"
  }]
};

Da es keine explizite Typisierung gibt, verwendet die Name-Eigenschaft hier standardmäßig den Array-Typ. Arrays können eine beliebige Anzahl von Elementen enthalten, einschließlich null - was nicht in ein 1-Tuple passt. Daher dein Fehler.

Ihr Fehler kann behoben werden, indem Sie dem Compiler einen Hinweis geben, dass Ihr Literal tatsächlich ein Tuple ist:

const config: Details = { Name: [{...}, {...}] };

Wenn Sie eine Reihe von Namen aufnehmen müssen, müssen Sie ein paar Castings durchführen, vielleicht etwa so:

if (names.length > 0) {
  const config = {
    Name: names as Details['Name']
  };
  Configuration(config);
}

(Sie können die if-Markierung entfernen, wenn Sie feststellen können, dass der Tuple einfach ein Fehler war, der von denjenigen geschrieben wurde, die die Typografien geschrieben haben.)

Beispielreferenz: https://www.typescriptlang.org/docs/handbook/basic-types.html

8
dbandstra

Wenn Sie die Schnittstelle folgendermaßen aktualisieren, sollte das Problem behoben werden: 

 interface Details {
        Name: Array<{
            First: string;
            Last: string;
        }>;
    }
6
Rajaram Nayak

Obwohl dies nicht direkt mit dieser genauen Frage zusammenhängt, kann Folgendes hilfreich sein, wenn Sie bei der Verwendung eines ES6-Map-Objekts dieses Problem haben: https://github.com/Microsoft/TypeScript/issues/8936 .

1
alukach