私は、インスタンス化するクラスタイプだけでなく、クラスのプロパティのデフォルト値のセットを渡すファクトリメソッドをいくつか用意しています。クラス。クラス型にインスタンス化されていないプロパティを渡そうとするとコンパイラが教えてくれるような型付けをしたいと思います。私はこれを行う方法を理解することはできません。ファクトリメソッドのクラスプロパティのインターフェイスタイプを取得する方法
ここに私がしたいことを示す簡単な例があります。
私が試してみると、「インターフェイスはクラスまたは別のインターフェイスだけを拡張するかもしれない」というコンパイラエラーが発生します。インターフェイスClassProps
の場合、T
から拡張できないためです。
class Base {
myId: number;
}
class Klass1 extends Base {
myString: string;
myNumber: number;
}
interface IBaseCtr<T> {
new(): T;
}
// Get an interface that is the properties of the class passed
interface ClassProps<T extends Base> extends T {}
// This method compiles, but doesn't check the prop names
//function factory<T extends Base>(ctrFunc: IBaseCtr<T>,
// initialData?: Object): T
function factory<T extends Base>(ctrFunc: IBaseCtr<T>,
initialData?: ClassProps<T>): T
{
let new_obj = new ctrFunc();
Object.assign(new_obj, initialData);
return new_obj;
}
let v1 = factory(Klass1, {myId: 10, myString: 'foo'});
let v2 = factory(Klass1, {badVar: 10});
それはフラグbadVar
として、この2回目の呼び出しでは許可されないようにinitialData
を入力取得する方法任意のアイデア?
興味深い。過去に私はクラスデータを表現するためのインターフェースを構築し、そのクラスを拡張しましたが、ここで十分ではないと思いますか? – Paarth
@Paarth私は他の場所でもそれを行っています。このケースでは、他の開発者がクラスとその他の関連する制約をどのように組み立てているかによって、そのメソッドを使用することはできません。 – Allen