我花了一天时间研究这个主题,但我没有找到任何线索。我发现的只是omission,因为我读过的任何内容都没有说明您可以在调用 Angular 4.4 时将非简单类型(我的意思是string
和number
)用于通用接口(“形状”)HttpClient.<T>get()
。
而不是未能描述问题,下面的示例代码是我想要做的:
// Injected in my real code ... but these are the libs being used.
import { HttpClientModule } from '@angular/common/http';
import { Observable } from "rxjs";
import 'rxjs/Rx';
interface IMyDataItem {
// In this example, using @Types/Decimal.js
// It appears the "problem" exists for any types beside the simples (number/string etc)
results: decimal.Decimal[];
}
class Service {
doSomethingCool() {
this._http
.get<IMyDataItem>("url://somewhere")
.subscribe(
data => {
// Call a method on the Decimal typed property
data.results[0].pow(3, 3);
}
);
}
}
它在语法上编译。TypeScript 正确地解析了泛型魔法——并识别出它data.results
是一个类型为 的数组Decimal
。
然而,在运行时(在 Chrome 中,在转换为 Javascript 之后)调用pow()
失败,理由是该方法不存在(实际上,调试它表明它是一个普通的旧 Javascript 对象)。
我对 TypeScript 和 Angular 4 很陌生——但这对我来说是合乎逻辑的。我只要求通用get()
调用将请求作为接口处理。它必须确定如何构造满足该接口的对象。我没有在任何地方构建实现该接口的实体对象,也没有在任何地方构建Decimal
.
(更新:这篇文章进一步让我相信我的直觉...... https://jameshenry.blog/typescript-classes-vs-interfaces/)
在官方文件(实际上我观察每一个非官方源)表明,它与(在我而言)的“简单”类型(特别是工作number
和string
) -这我的直觉说“有道理”,因为一个JSON
对象可以有简单的字符串和简单的数字。
我错过了明显的吗?或者直接映射到更复杂的类类型是不可能的?
如果这是不可能的 - 你通常如何处理它?我一直在寻找“最佳实践”模式——结果很短。
再次,我的直觉(并且只有我的直觉说我应该在处理 API 请求的类中拥有一个私有方法 - 并返回一个Observable
(调用者将订阅的)它给出一个复杂的对象类型(例如一个User
类数组,其中包含与用户相关的方法):
class Service {
// Return a complex object type Observable for consumption elsewhere
doSomethingCool(): Observable<IMyDataItem> {
return this._http
.get<IMyDataItem>("url://somewhere");
}
}
那有意义吗?TIA。