私はjson
と呼ばれる定数リテラルごJSON形式のオブジェクトを代入します:
const json = [
{
"B1": {
"A": {
"Headline": "Hello World",
"Text": "This is a hello world text"
},
"B": {
"Headline": "Hallo Welt",
"Text": "Ein Hallo Welt Text"
},
"C": {
"Headline": "Bonjour Monde",
"Text": "Le monde est à toi."
}
}
}
];
あなたのタイプの定義を持ついくつかの問題があります。まず、タイプRootObject
の変数にJSONスタイルのオブジェクトを割り当てたい場合は、class
を使用しないでください。 new RootObject()
のように、コンストラクタを呼び出してクラスのインスタンスを作成します。それにオブジェクトリテラルを代入/キャストすることはできません。 TypeScriptを使用すると、実行時に問題が発生する可能性が高くなります。代わりに、オブジェクトリテラルを受け入れるinterface
またはtype
のいずれかを使用します。だからinterface
に切り替えましょう:
export interface RootObject {
blogposts: BlogPostIdObject[]
}
export interface BlogPostIdObject {
[templateIdObject: string]: TemplateIdObject
}
export interface TemplateIdObject {
Headline: string;
Text: string;
}
さて、試してみましょう。
const interpretedJson: RootObject = json; // error!
ええとああ、json
がblogposts
という名前のプロパティが含まれていないことを訴えています。そしてそれはしません。本当に、あなたはRootObject
だけでにないに、BlogPostIdObject[]
の配列なりたい配列を持っている:
// note, changed to type alias instead of interface
export type RootObject = BlogPostIdObject[];
export interface BlogPostIdObject {
[templateIdObject: string]: TemplateIdObject
}
export interface TemplateIdObject {
Headline: string;
Text: string;
}
はのは、もう一度試してみよう!
const interpretedJson: RootObject = json; // error!
今ではjson[0].B1
がTemplateIdObject
と一致しないことを訴えています。そして、そうではありません。TemplateIdObject
は実際にはテンプレートIDを全く持たないからです。それはちょうどHeadline
とText
のプロパティを持っています。実際にはTemplateIdObject
にキーがいくつかの文字列で、値がHeadline
とText
のプロパティを持つようにします。さんが離れてTemplateIdObject
キーと(私はTemplateValuesObject
と呼ぶことにします)値に変換を壊すことによってそれを修正してみましょう:だから
export type RootObject = BlogPostIdObject[];
export interface BlogPostIdObject {
[blogIdKey: string]: TemplateIdObject
}
export interface TemplateIdObject {
[templateIdKey: string]: TemplateValuesObject
}
export interface TemplateValuesObject {
Headline: string;
Text: string;
}
const interpretedJson: RootObject = json; // okay
、今では動作します。われわれはすべて終わったのですよね?
よくわかりません。この定義はあまり制限的ではありません。
これは[{"B1": {...}, "B2": {...}, ...}]
や[{}]
のようなIDが多いブログ投稿を持つことができます。それは大丈夫ですか?そうでない場合は、JSONオブジェクト自体が不思議ではありません。なぜなら、JSONオブジェクトは不明な名前の単一のプロパティを保持するように設計されていないからです。配列の各ブログ投稿がちょうどblogId
とtemplates
の1つのセットを持つように、JSONを[{"blogId":"B1", "templates":{"A"...}}]
のように変更することを考えてください。
[{"B1":{"A": {...}, "B": {...}, "C": {...}, "D": {...}, ...}}]
や[{"B1": {}}]
のような多くのIDを持つテンプレートが用意されています。それは大丈夫ですか?そうでない場合は、正確に"A"
,"B"
、"C"
となるはずですか?その場合は、TemplateIdObject
を変更して正確なキーを指定することができます。
これで完了した場合や、型定義や場合によってはJSON構造自体の改訂が必要になる場合は、あなたの責任です。希望は助けます。がんばろう!