[英]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?)函數並不完全相同,但是希望它可以使您朝正確的方向前進。
您使用的庫非常糟糕,並且存在語義錯誤。 new
是用於初始化類類型的實例的關鍵字。 返回類型應始終與此類類型一致。 正確的定義應為:
export declare type Clazz<T> = { new (...args: any[]): Clazz<T>; };
解決這個問題。 您始終可以使用關鍵字as
和Object.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.