このようなインターフェイスがあります
export interface Details {
Name: [{
First: string;
Last: string;
}];
}
監視可能な設定変数があります
Configuration: KnockoutObservable<Details> = ko.observable<Details>();
次のようにコンストラクタで値を割り当てたいと思います-
config = {
Name: [{
First: "ABC",
Last: "DEF"
},
{
First: "LMN",
Last: "XYZ"
}]
};
this.Configuration(config);
私はエラーが発生しています:
プロパティ 'Name'のタイプは互換性がなく、プロパティ '0'はタイプにありません。
タイプ '{First:string; Last:string; } [] 'は、タイプ' [{First:string; Last:string; }] '
他の場所で使用されているため、インターフェイスを変更することはできません。この構成変数を初期化する正しい方法は何ですか?
前もって感謝します。
私は同じ問題に遭遇し、インターフェースを次のように変更することで回避しました。
interface Details {
Name: {
First: string;
Last: string;
}[];
}
インターフェースを変更したくないかもしれませんが、これがこの状況にあるすべての人に役立つことを願っています。
この型定義では:
interface Details {
Name: [{
First: string;
Last: string;
}];
}
Name
はコンパイル時の配列ではありません。これは、1つの要素を持つタプルです。 TypeScriptのタプルには追加の要素を含めることができますが、要素をなくすことはできません。 1タプルとして、Name
は本質的に少なくとも 1つの要素を持たなければならない配列です。
ただし、この値では:
const config = {
Name: [{
First: "ABC",
Last: "DEF"
},
{
First: "LMN",
Last: "XYZ"
}]
};
明示的な型指定はないため、ここでのName
プロパティはデフォルトで配列型になります。配列は、ゼロを含む任意の数の要素を持つことができます。これは1タプルに収まりません。したがって、あなたのエラー。
あなたのリテラルが実際にタプルであるというヒントをコンパイラに与えることで、あなたのエラーを修正できます:
const config: Details = { Name: [{...}, {...}] };
名前の配列を取得する必要がある場合は、次のようなキャストを行う必要があります。
if (names.length > 0) {
const config = {
Name: names as Details['Name']
};
Configuration(config);
}
(タプルがタイピングを書いた人による単純な間違いであると判断できる場合、ifチェックを削除できます。)
タプルリファレンス: https://www.typescriptlang.org/docs/handbook/basic-types.html
このエラーは、配列を誤って入力することで発生する可能性があります(私がやったように)。
myArray:[]; //Incorrect, results in error message of `Property '0' is missing in type`
myArray: Array<string>; //Correct
myArray: string[]; //Also correct
その理由は、中かっこが配列ではなく、TypeScriptのTupleを示すためです。
インターフェイスを次のように更新すると、問題が修正されます。
interface Details {
Name: Array<{
First: string;
Last: string;
}>;
}
この正確な質問とは直接関係ありませんが、ES6 Mapオブジェクトの使用中にこの問題が発生している場合、以下が役立つ可能性があります。 https://github.com/Microsoft/TypeScript/issues/8936 =。