2017-07-12 15 views
0

データ構造に基づいたクラスを生成するJavaScriptコードがあります。メソッドの名前と署名は、そのデータ構造の内容によって異なります。この関係をTypeScriptで表現することは可能ですか?それに失敗しても、少なくとも、出力クラスに特定の(可能であればコンパイル時には)特定のメソッドセットがあり、特定のメソッドシグネチャセットがあることを示すことは可能ですか?ベース4つの事前定義されたメソッドのシグネチャの1つである、各メソッドのシグネチャと、プロトタイプが実行時にTypeScriptで定義されているクラスを表すことは可能ですか?

{ 
    'methodName1': { 
    'flag1': true, 
    'flag2': false 
    }, 
    'methodName2': { 
    'flag1': false, 
    'flag2': false 
    } 
} 

および方法methodName1methodName2有するとともに、得られたクラス:私の特定の場合において

は、入力されたデータは、このようになります。フラグの値について

+0

活字体は本当に唯一のコンパイル時の間に存在するので、それはそれはであなたを助けることができないという意味になります実行時に情報を入力します。 データ構造が一定であれば、それに基づいてデータ型を作成することができます。ただし、実行時にしかアクセスできない場合は、動的オブジェクトを単なるキーと値のペアとして入力するよりも、何か良いことをすることはできません。 作成するコードの例がありますか? – y2bd

+0

特定のクラスの代わりに抽象インターフェイスを使用すると、よりうまくいくかもしれません。 – Bergi

+0

実行時またはコンパイル時にこれらのクラスを生成しますか?どうか明らかにしてください。コンパイル時に型の安全性がチェックされます。実行時はコンパイル時に来ます。したがって、コンパイル時に使用される実行時にインタフェースを定義することはできません。これは[X/Yの問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)であると考えてください。おそらくあなたの問題はtypesafety /コンパイル時のチェックを必要としません実際には必要ないクラスを生成する必要があります)。 –

答えて

0

あなたのフラグの例を使用すると、ソート交差点の種類を使用しての工場を作成することができるかもしれない:

type Switch<A, B, C, D> = 
    & ((f1: false, f2: false) => A) 
    & ((f1: false, f2: true) => B) 
    & ((f1: true, f2: false) => C) 
    & ((f1: true, f2: true) => D); 

declare let provider: Switch< 
    (arg: number) => number, 
    (arg: string) => string, 
    (arg: boolean) => boolean, 
    (arg: Date) => Date 
>; 

let afun = provider(false, false); 
afun(3); // returns number 

let bfun = provider(false, true); 
bfun("hello"); // returns string 

let cfun = provider(true, false); 
cfun(false); // returns boolean 

let dfun = provider(true, true); 
dfun(new Date()); // returns Date 
関連する問題