2017-09-25 9 views
0

計算されたプロパティを1つだけ持つクラスを作成してJSON応答を処理できるのは意味がありますか?計算されたプロパティが1つだけのTypeScriptクラスを作成する

私は次の問題があります。私はブログ投稿を作成したいと思います。作成する3つのオプションがあります。

  • A)ポストEN
  • Bブログ)は、ポストGER
  • Cブログ)異なるテンプレートがあるはずのブログ記事によってはポストFRに

ブログ。

今私は便利な方法ですべての投稿を編集できるマスタービューを持っていたいと思います。そのため

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." 
     } 
    } 
    } 
] 

B1は、ユニークなブログ記事識別子です。 A、B、Cをテンプレートキーと見なす必要があります。 "A"ならテンプレートAを使いたいということです。

実際の質問では、TypeScriptとその機能を使いたいと思います。

BlogPostIdObjectクラスは意味がありますか?私はそれを作成して、着信JSONを特定の形状のオブジェクトに解析する簡単な方法を持っています。以下では

export class RootObject { 
    blogposts: BlogPostIdObject[] 
} 

export class BlogPostIdObject { 
    [templateIdObject: string]: TemplateIdObject 
} 

export class TemplateIdObject { 
    Headline: string; 
    Text: string; 
} 

答えて

1

私は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! 

ええとああ、jsonblogpostsという名前のプロパティが含まれていないことを訴えています。そしてそれはしません。本当に、あなたは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].B1TemplateIdObjectと一致しないことを訴えています。そして、そうではありません。TemplateIdObjectは実際にはテンプレートIDを全く持たないからです。それはちょうどHeadlineTextのプロパティを持っています。実際にはTemplateIdObjectにキーがいくつかの文字列で、値がHeadlineTextのプロパティを持つようにします。さんが離れて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オブジェクトは不明な名前の単一のプロパティを保持するように設計されていないからです。配列の各ブログ投稿がちょうどblogIdtemplatesの1つのセットを持つように、JSONを[{"blogId":"B1", "templates":{"A"...}}]のように変更することを考えてください。

[{"B1":{"A": {...}, "B": {...}, "C": {...}, "D": {...}, ...}}][{"B1": {}}]のような多くのIDを持つテンプレートが用意されています。それは大丈夫ですか?そうでない場合は、正確に"A","B""C"となるはずですか?その場合は、TemplateIdObjectを変更して正確なキーを指定することができます。

これで完了した場合や、型定義や場合によってはJSON構造自体の改訂が必要になる場合は、あなたの責任です。希望は助けます。がんばろう!

関連する問題