いくつかのデータを含むオブジェクトがあると仮定します。すべてのタイプが次のように使用できるように、汎用マッパー(それぞれ関数のみ-常に新しいクラスをインスタンス化する必要はありません)を作成したいと思います:this.responseMapper.map<CommentDTO>(data);
指定されたタイプからすべてのプロパティを取得し、それにデータをマップするだけです。私がこれまでに試したこと:
_public map<T>(values: any): T {
const instance = new T();
return Object.keys(instance).reduce((acc, key) => {
acc[key] = values[key];
return acc;
}, {}) as T;
}
_
new T();
はエラーをスローします:_'T' only refers to a type, but is being used as a value here.
_
これを行う正しい方法は何ですか?
型コンストラクターをメソッドに渡す必要があります。 TypeScriptは実行時にジェネリックスを消去してT
を実行時に認識しません。また、values
a btiを締めて、T
のメンバーのみが渡されるようにします。これはPartial<T>
で実行できます。
public map<T>(values: Partial<T>, ctor: new () => T): T {
const instance = new ctor();
return Object.keys(instance).reduce((acc, key) => {
acc[key] = values[key];
return acc;
}, {}) as T;
}
使用法:
class Data {
x: number = 0; // If we don't initialize the function will not work as keys will not return x
}
mapper.map({ x: 0 }, Data)