簡體   English   中英

傳遞通用類類型作為通用函數的參數

[英]Pass a generic class type as a parameter of a generic function

我正在使用具有來自Json的方法的轉換器(外部庫),如下所示。 我想構建一個通用的RESTService,但是我不知道如何將通用的類類型傳遞給該方法。

// From the library
export declare type Clazz<T> = {
  new (...args: any[]): T;
};

// From the library
export class Converter {
  ...
  public fromJson<T>(json: any, clazz: Clazz<T>): T { ... }
  ...
}

// ******************************************************

// My Service on my Angular app
class RESTService<T> {
  ...
  public save(t: T): Observable<T> {
    return this.httpClient.post('http://...', t)
      .pipe(map(res => this.converter.fromJson(res, ???)));
  }
  ...
}

您可以將t.constructor用作t.constructor Clazz<T>參數。 您需要使用as告訴TypeScript正確的類型:

// From the library
declare type Clazz <T> = {
    new(...args: any[]): T;
};

// From the library
class Converter {
    public fromJson<T>(json: any, clazz: Clazz<T>) { return new clazz(); }
}

class Test {
    public testIt<T>(test: T) {
        const converter = new Converter();
        var o = converter.fromJson("{}", test.constructor as new (...args: any[]) => T);
        return o;
    }
}

class TestObj {
    testProp: string = "hello";
}

var o = new TestObj();
var t = new Test();
var a = t.testIt(o);
console.log(JSON.stringify(a));

這似乎可以在TypeScript Playground中進行編譯和工作 ,但是與往常一樣,您應該在自己的環境中對其進行測試。

我做了一些改變,只是為了讓fromJson可以得到可記錄的結果,並且顯然testIt與您的(Angular?)函數並不完全相同,但是希望它可以使您朝正確的方向前進。

  1. 您使用的庫非常糟糕,並且存在語義錯誤。 new是用於初始化類類型的實例的關鍵字。 返回類型應始終與此類類型一致。 正確的定義應為:

     export declare type Clazz<T> = { new (...args: any[]): Clazz<T>; }; 
  2. 解決這個問題。 您始終可以使用關鍵字asObject.create(null)來轉換大多數對象類型,以避免編譯器檢查:

     class RESTService<T> { ... public save(t: T): Observable<T> { let clazz = Object.create(null) as Clazz<T>; // clazz.someValue = 'Hello world'; return this.httpClient.post('http://...', t) .pipe(map(res => this.converter.fromJson(res, clazz))); } ... } 

    Object.create(null)為您提供一個沒有任何方法綁定的js對象-純結構空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM