web-dev-qa-db-ja.com

Typescript:オブジェクトをtypeにマップする方法は?

いくつかのデータを含むオブジェクトがあると仮定します。すべてのタイプが次のように使用できるように、汎用マッパー(それぞれ関数のみ-常に新しいクラスをインスタンス化する必要はありません)を作成したいと思います: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._

これを行う正しい方法は何ですか?

5
sandrooco

型コンストラクターをメソッドに渡す必要があります。 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)