12

typescriptを使用してアプリのUIに取り組んでいます。同時に、他の人が私にデータを提供することに取り組んでいます。データ契約に同意しましたが、プロセスでエラーが発生しやすく、サーバーから無効なデータオブジェクトを取得し続けています。だから私の質問は、typescriptで定義されたインターフェイスのいくつかを使用して(実行時に)動的オブジェクトを何らかの方法で検証できるかどうかです。


この質問は2012年に行われたため、2015年に行われたTypeScriptを使用して、オブジェクトが実行時にインターフェイスを実装しているかどうかを確認することと重複することはできません。

4

3 に答える 3

8

現状では、TypeScript インターフェースは純粋にコンパイル時のエンティティであるため、コンパイル時にどのインターフェースが存在したかを知ることはもちろん、ランタイム検証を行う方法はありません。したがって、答えは次のいずれかのように思われます。

  1. オブジェクトの検証に使用できるランタイム オブジェクト表現に TypeScript インターフェイスを変換するツールを作成するか、次のようにします。
  2. TypeScript インターフェースをランタイム オブジェクト表現として複製する

Github には多くのバリデーターが存在するため、ランタイム表現として JSON スキーマを使用できます。TypeScript インターフェース --> JSON スキーマ コンバーターは、いつか誰かが作ってくれることを願っていますが、私が知る限り、まだ存在していません。

于 2012-10-12T22:43:32.840 に答える
6

Brian が指摘するように、インターフェイスはコンパイル時にのみ明示され、コンパイラによっていわゆる名前付き型として使用されます。言語仕様のセクション 7 では、これについて次のように説明されています。

インターフェイスには実行時の表現がなく、純粋にコンパイル時の構成要素です。インターフェイスは、必要なプロパティの形状、パラメーターとして渡されるオブジェクト、および関数から返されるオブジェクトを文書化および検証するのに特に役立ちます。

仕様のセクション 7.4 のさらに下には、Typescript での動的型チェックの優れた説明があります。

TypeScript は、オブジェクトが特定のインターフェイスを実装しているかどうかを動的にテストするための直接的なメカニズムを提供しません。代わりに、TypeScript コードは、適切なメンバーのセットがオブジェクトに存在するかどうかをチェックする JavaScript 手法を使用できます...

仕様の例では、次の 3 つのインターフェイスが定義されています。

interface Mover {
    move(): void;
    getStatus(): {speed: number;};
}

interface Shaker {
    shake(): void;
    getStatus(): {frequency: number;};
}

interface MoverShaker extends Mover, Shaker {
    getStatus(): { speed: number; frequency: number; }; 
}

MoverShakerMoverとを組み合わせShakerて、新しい複合インターフェースにします。特定の型が interface を満たすことを実行時に検証するにMoverShakerは、次のように Javascript コードを使用できます。

var obj: any = getSomeObject();
if (obj && obj.move && obj.shake && obj.getStatus) {
    var moverShaker = <MoverShaker> obj;
    ...
}

Typescript でコンパイル時のチェックを行うには、アプリケーションの 2 つの部分の間で交換される型のインターフェイスを定義する必要があります。現在、(上記のように) 動的チェック コードを手動で作成する必要があります。したがって、同期して更新するのを忘れると、静的な型と動的なチェック コードがある時点で逸脱する可能性があります。Brian が指摘するように、コードを自動的に生成するツールがあれば便利です。

于 2012-10-13T08:59:21.900 に答える
1

必要に応じて、動的インターフェイスチェッカーを試してください。例を次に示します(完全な例)。

interface PhysicalObject { color : Color; intact : bool; weight : number; }

class Car implements PhysicalObject {
    public intact = true;
    constructor(public color : Color, public weight : number) {};
}

function scratch(aCar : Car) {
    typeCheck(JSVenv, arguments, schemas, ["PhysicalObject"]);
    console.log("Scratching the car!");
    aCar.intact = false;
}

と同等のコードscratch({ intact: 42, color: Color.RED })が呼び出されると、次のようなエラーがスローされます。

AssertionError: Runtime typecheck failed on argument number 1:
    Value: { color: 0, weight: 'four', intact: true },
    Schema: ...,
    Error reports (length 1):
    [
      {
        uri: 'urn:uuid:b9b8e6fd-b14b-490d-9372-d2bd22e8a246#/weight',
        schemaUri: 'urn:uuid:c76ddd92-15da-43a6-831e-6717f253efe5#/properties/weight',
        attribute: 'type',
        message: 'Instance is not a required type',
        details: [ 'number' ]
      }
    ]

手順については、メインページを参照してください:https ://github.com/ysangkok/typescript-interface-to-jsonschema

自動タイプチェックを追加しますが、TypeScriptにはnode-falafelのようなものが必要です。

于 2012-10-16T01:07:02.003 に答える