![](/img/trans.png)
[英]TypeScript - passing a data type of interface in the constructor error
[英]Passing type as constructor variable in TypeScript
我正在嘗試在 Angular 中創建數據服務,這對所有 CRUD HTTP 請求都是通用的。 但是,我希望公共函數返回類型化的Observable<T>
。 所以我想我會將一個類型傳遞到我的服務的constructor
中,存儲在局部變量中,然后實例化該服務類的每個客戶端對象將提供它期望從服務的返回函數中獲得的“類型”,以便我post
、 put
、 patch
、 delete
get
將返回已經輸入的Observable
。 像這樣:
export class DataService {
constructor(private http: HttpClient, private dataType: Type )
}
getAll(): Observable<dataType[]> {
return http.get<dataType[]>(...);
}
post(dataIn: dataType): Observable<dataType> {
return http.post<dataType>(...);
}
}
可以嗎?
您想要的是為您的服務類提供一個通用類型。 TypeScript 被編譯為 JavaScript,並會在此過程中丟失所有類型。 以下示例顯示了如何為類使用泛型類型:
export class MyClassService<T = DefaultType> {
constructor(private http: HttpClient) {}
getSomeData(): Observable<T> {
return this.http.get<T>(...)
}
}
可以嗎?
有點兒。 您可以獲得您想要的結果,但不是通過您描述的方法。
所以我想我應該將一個類型傳遞到我服務的構造函數中,存儲在局部變量中
類型不能存儲為變量,因為 TypeScript 類型在運行時不存在。
實例化此服務類的每個客戶端對象都將提供它期望從服務的返回函數獲得的“類型”
您可以做的是將DataService
變成一個通用類。 這意味着DataService
的每個實例都將具有不同的數據類型T
您可以在調用構造函數時通過設置泛型來提供類型:
const userService = new DataService<User>(client);
const commentService = new DataService<Comment>(client);
該通用類將如下所示:
export class DataService<T> {
constructor(private http: HttpClient) {
}
getAll(): Observable<T[]> {
return this.http.get<T[]>(...);
}
post(dataIn: T): Observable<T> {
return this.http.post<T>(...);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.