2017-09-30 3 views
3

私はクラスCと、オブジェクトのインスタンス(JSONから)を持っているとしましょう。Typescript:Object to class

class C { 
    str:string; 
    num:number; 
} 

var o = JSON.parse ("{\"num\":123, \"str\":\"abc\"}"); 

のI/O割り当てとCのインスタンスを初期化し、それがコピーコンストラクタ/機能で自分でそれを行うことなく、未定義の値についてだけでなく、種類をチェックすることができます方法はありますか?

値が不明または未定義の場合、またはタイプが一致しない場合は、エラーまたは例外を取得したいと考えています。

ありがとうございます!

+0

クラスCにインターフェイスを実装させることができませんでしたか?私があなたの問題を正しく理解していれば、これは値が存在し、タイプが正しいことを保証するでしょう。エラーに関しては、あなたのソリューションは有効でない場合、ビルドに失敗します。これがあなたの問題に役立つかどうか分かりません –

+1

問題はコンパイラがJSON.parseが返すものを推測できないため、コンパイル時にエラーチェックを取得できないことです。 JSONがどこから来ているのか、それが何に含まれるかどうか確かめることができるかどうかを知ることは重要です。そうでない場合は、ランタイムエラーチェックが必要です。 – Kokodoko

答えて

1

ここでは、オブジェクトを直接作成する例を示します。これにより、ライブエラーチェックが行われます。 JSON.parseの問題は、コンパイラがコンパイル時に何を返すかをチェックしないことです。不明なライブデータを扱う場合は、手動でエラーチェックを行う必要があります。

interface Obj { 
    str: string 
    num: number 
} 

class C { 
    constructor(o:Obj) { 

    } 
} 

var o = {test:43, str:"abc"} 
var p = {num:43, str:"abc"} 

var instanceOne = new C(o) // not allowed 
var instanceTwo = new C(p) // allowed 
+1

これは、オブジェクトoとpがコンパイル時に定義されているためです。 JSONの動的文字列の場合はそうではありません。私は実行時情報のコンパイル時チェックを要求しませんでした。私は自分で実装する必要はないランタイムチェックにも満足しています。 – chris01

+1

システム全体が実行時に存在しないため、手動でチェックをプログラムしなくてもタイプを確認する方法はありません。さて、あなたは 'try catch'を使うことができます.... :) – Kokodoko

+0

なぜあなたはそのコードで答えたのか分かりません。元のコメント - _ "コンパイラはJSON.parseが返すものを推測することができないため、コンパイル時にエラーチェックが行われません" _が正しい。型情報を抽出し、問題のランタイムドメインを適切なものにするための追加ステップ。 –

1

Typescriptはコンパイル時に実行される型システムであるため、あなたが求めるものは不可能です。

type guardsをご覧になり、parseという種類の条件付きブロック内に型推論を提供するために使用することができます。

1

あなたが求めているのは、JSONスキーマ検証ツールです。検証は実行時に実行する必要があります。 https://github.com/epoberezkin/ajvで完全なJSONスキーマバリデータを確認してください。またはhttps://www.npmjs.com/package/js-schemaより簡単なものを確認してください。

+1

であり、あなたのtypescriptソースからスキーマを抽出することができます:https://github.com/YousefED/typescript-json-schema –

関連する問題