2017-04-25 3 views
0

タイプanyのオブジェクトを特定のインタフェースに準拠したオブジェクトに変換する、適切なエラー処理を行うApiResponseそのオブジェクトになるために必要なプロパティを持っていません。タイプanyのオブジェクトは、JSON.parseまたは同等のJSONペイロードから取得されました。私は理想的には、この変換を扱う適切なエラー処理も好きです。私は次のアプローチを考え出しましたが、TypeScriptを適切に使用しているか、最適なパターンを利用しているかはわかりません。「Any」オブジェクトをTypeScriptインタフェースに準拠したオブジェクトに安全に変換する

答えて

-1
` 

export interface ApiResponse { 

    code: number 
    type: string 
    message: string 

} 



export function readApiResponse(json: any): ApiResponse { 

    if (!json.hasOwnProperty('code')) { 
     throw 'No code property' 
    } 

    if (!json.hasOwnProperty('type')) { 
     throw 'No type property' 
    } 

    if (!json.hasOwnProperty('message')) { 
     throw 'No message property' 
    } 

    return json 
} 


loadData() { 
     fetch("data.json") 
      .then(response => response.json()) 
      .then((json: any) => { 

       console.log(json) 

       let r = readApiResponse(json) 

       console.log(r) 

       this.setState({message : r.message }) 

      }) 
      .catch ((error) => { 
       console.log(error) 
      }) 

    } 

`

+0

フム。私はなぜこの質問とアプローチがダウン投票されたのか分かりません。これは、JSONから生成されたオブジェクトに、インターフェイスに準拠するために定義された適切なプロパティがあることを保証することに特有です。私は実行時に、蒸散後、インターフェースの概念はもはや使われていないと思います。 –

+0

私は有権者ではありませんが、ネストされた型、オプションの値、その他の制限付きの値を持つ現実的なサイズのAPIにどのように拡張されるのかは分かりません。また、レスポンスに余分なフィールドがある場合でもエラーは発生しません...(ただし、それは...そうする必要はありません) –

+0

タイプが期待どおりでない場合、ああ、実際にはエラーは発生しません。したがって、 '{code:" foo "、type:11、message:[]}'はあなたの 'readApiResponse'をうまく処理します。 –

関連する問題