gpt4 book ai didi

angular - Angular `HttpClient` `.get()` 泛型可以有非简单的属性类型吗? (例如 `string` 或 `number` 除外)

转载 作者:搜寻专家 更新时间:2023-10-30 22:03:26 27 4
gpt4 key购买 nike

我花了一天时间研究这个主题,但我没有找到任何线索。我所发现的只是遗漏,因为我读过的任何内容都表明您可以使用非简单类型(我指的是 stringnumber )调用 Angular 4.4 时的通用接口(interface)(“形状”)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.resultsDecimal 类型的数组.

但是在运行时(在 Chrome 中,在转换为 Javascript 之后)调用 pow()失败,引用该方法不存在(事实上,调试它表明它是一个普通的旧 Javascript 对象)。

我是 TypeScript 和 Angular 4 的新手 - 但这对我来说是合乎逻辑的。我只问了通用 get()调用以将请求作为接口(interface)处理。它必须确定如何构造满足该接口(interface)的对象。我没有在任何地方构造一个实现该接口(interface)的实体对象,也没有在任何地方构造一个 Decimal。 .

(更新:这篇文章进一步让我相信我的直觉...... https://jameshenry.blog/typescript-classes-vs-interfaces/ )

official documentation (事实上​​,我观察到的每一个非官方来源)都证明了它使用(用我的话说)“简单”类型(特别是 numberstring )——我的直觉说这是“有道理的”,因为 JSON对象可以有简单的字符串和简单的数字。

我错过了显而易见的东西吗?或者直接映射到更复杂的类类型是不可能的?

如果不可能 - 您通常如何处理它?我一直在寻找“最佳实践”模式 - 但没有找到。

再一次,我的直觉(这只是我的直觉说我应该在处理 API 请求的类中有一个私有(private)方法 - 并返回一个 Observable(调用者将订阅它) 它给出了一个复杂的对象类型(例如 User 类的数组,其中包含与用户相关的方法):

class Service {
// Return a complex object type Observable for consumption elsewhere
doSomethingCool(): Observable<IMyDataItem> {
return this._http
.get<IMyDataItem>("url://somewhere");
}
}

这有意义吗? TIA。

最佳答案

Angular 的

http.get() 返回一个 Response。首先尝试将其映射到 JSON:

import "rxjs/add/operator/map";

....
class Service {
doSomethingCool(): Observable<IMyDataItem> {
return this._http
.get("url://somewhere");
.map((response:Response) => response.json() as IMyDataItem);
}
}

附注您需要导入 rxjs 才能使用 map()

编辑

在对评论进行讨论之后,我对“Angular HttpClient .get() 泛型是否具有非简单属性类型”问题的回答是:

不是,因为默认情况下 get() 方法默认返回 JSON。并基于 this site , JSON数据类型只能是字符串、数字、对象(JSON对象)、数组、 bool 值或null。

关于angular - Angular `HttpClient` `.get()` 泛型可以有非简单的属性类型吗? (例如 `string` 或 `number` 除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46569064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com