Angular 4 投射http响应的正确方法

2024-07-03

我在 Angular 4 中创建了一个服务,并使用以下代码通过 REST/JSON(Angular 的新功能)获取数据:

界面

export interface IItem {
    Id: number;
    Title: string;
}

Service

import { IItem } from './item';
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/map';

@Injectable()
export class ItemTest {

    constructor(private _http: HttpClient) {}

    getItems(): Observable<IItem[]> {
        return this._http.get<IItem[]>('url')
            .do(data => {
                console.log(data);
            })
    }
}

如果响应采用这种格式,则 http 转换为 IITem 可以正常工作

[
    {
        "Id": 53,
        "Title": "Test Document 4.docx"
    },
    {
        "Id": 55,
        "Title": "Test Document 2.docx"
    }
]

但服务器的实际响应看起来像这样,并且转换不起作用。将响应的“结果”部分转换为 IItem 数组的最佳方法是什么?

{
    "d": {
        "results": [
            {
                "Id": 53,
                "Title": "Test Document 4.docx"
            },
            {
                "Id": 55,
                "Title": "Test Document 2.docx"
            }
        ]
    }
}

get 的特定类型应该描述您期望收到的实际响应 JSON 的形状。然后编译器可以实际上帮助你告诉您是否正在访问和返回正确的内容。在你的情况下:

getItems(): Observable<IItem[]> {
    return this._http.get<{ d: { results: IItem[] } }>('url')
        .map(response => response.d.results)
        .do(data => {
            console.log(data);
        }):
}

请注意,这些都不是casting响应数据,只是描述 it.


至于你的其他建议:

.get<IItem[]>(...)
.map((data) => data['d']['results']) 

如果您要错误地断言响应的类型,那么进行不安全的属性访问,编译器只能假设是any,您可能根本不使用类型。当编译器告诉您正在访问错误的属性时,不要只是忽略它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 4 投射http响应的正确方法 的相关文章

  • 检查标记坐标是否在边界内

    我在用着leafletAngular 6 应用程序中的地图 我获取每个项目的位置信息为 lat xx lng xx 我还得到了边界对象 它描述了地图当前可见的区域 它随着拖动和缩放而变化 边界对象如下所示 northEast lat 76
  • 离子选择:预选值在单击一次之前是不可见的

    我刚刚在 ionic 版本 6 中创建了一个 ion select 我的问题是 我在页面加载时已成功预选了一个值 但此预选值未显示在 UI 中 它只是在我单击选择之后出现 但在它没有出现之前 如图 2 所示 我在 ionViewWillEn
  • 如何以角度形式将自定义错误消息设置为表单

    我的组件中有以下代码 if form controls minRange hasError min form controls minRange setErrors min true 我在输入中收到消息 minRange 无效 但我想将错误
  • 我怎样才能制定一个结构指令来包装我的 DOM 的一部分?

    目前 我的 HTML 中有以下行 p this is my first line p 使用包装器指令 我想添加第二段并将其包装在 div 中 因此它看起来像这样 p this is my first line p 然后该指令将添加包装器和第
  • 在 Angular 2 中动态更新 css

    假设我有一个 Angular2 组件 home component ts import Component from angular2 core Component selector home templateUrl app compone
  • Angular 5:表内的动态表单验证

    我正在尝试使用表单组验证表内的输入字段 但无法实现相同的目标 我使用 ngFor 来迭代数据 因为我必须在表的第一列中显示该数据 而其他列只是输入文本字段 我必须在其中添加表单验证 因此 我添加了该字段的唯一表单控件名称的索引 HTML代码
  • 升级到 Angular v9 并启用 Ivy 后 Angular 编译失败

    我们最近将 Angular 应用程序升级到了最新版本的 Angular Angular v9 我们所有的依赖项也都升级了 ng update 表示我们所有的依赖项都 按顺序 当我们在启用 Ivy 的情况下构建应用程序时 编译过程会失败并出现
  • Bootstrap 样式不适用于 Angular2 组件

    Bootstrap 样式不适用于 Angular2 组件 在以下 Angular2 组件中 它不能作为 ui 中的引导流体容器工作 如果我在带有 div 元素的组件内使用 container fluid 则会在作品中出现 例如 不工作 Co
  • Angular 2 中的动态路由加载失败。 (测试版)

    我想从以 JSON 格式获取的服务动态加载 RouteConfig 的路由 path about name About component AboutComponent path contact name Contact component
  • 将 MathJax 集成到 SystemJS 构建中

    I use SystemJS建立一个Angular 2应用程序 我想开始使用MathJax在一个组件中 我安装了 npm install save dev mathjax npm install save types mathjax Mat
  • 将 MathJax 集成到 SystemJS 构建中

    I use SystemJS建立一个Angular 2应用程序 我想开始使用MathJax在一个组件中 我安装了 npm install save dev mathjax npm install save types mathjax Mat
  • 角度自动完成对象

    我正在努力了解如何在使用对象时使用角度材质自动完成 我基本上遵循 Angular 文档 只是用选项对象替换了选项数组 但我不确定如何让它工作 介意来这里看看吗 如果问题在其他地方有很多答案 我会删除该问题 这是我的 html 和 ts 组件
  • 如何使用 systemjs 在最小的 Angular 2 应用程序中加载 RxJS?

    我无法使用 RxJS 获得最小的 Angular 2 应用程序 我使用 Typescript tsc 1 6 2 和 systemjs 进行模块加载 如何让 systemjs 正确加载 Rx 模块 我已经没有办法尝试了 如果有人指出我做错了
  • Angular 7滚动事件不触发

    用于在 MatDialog 组件中的 Angular 应用程序中实现间谍导航栏 我实现了一个指令来监视滚动事件 使用 HostListener window scroll event 我也尝试过 scroll 作为事件名称 但该事件似乎并没
  • Jasmine 测试中 AfterViewInit 的生命周期钩子

    我对与 Jasmine 测试相关的生命周期挂钩感到困惑 LifeCycle Angular 文档没有提到测试https angular io guide lifecycle hooks https angular io guide life
  • Angular 2:NgbModal 在视图中嵌入

    假设我有这样的模态模板 div class modal header h3 h3 div div class modal body div
  • 找不到名称“HammerManager”

    我在用 角 2 0 0 rc 5 angular2 材料2 0 0 alpha 7 4 Angular CLI 1 0 0 beta 11 webpack 2 当我尝试编译时 它会抛出错误 找不到名称 HammerManager 请参阅随附
  • 使用 store 和 http 使用 ngFor 进行无限循环

    我的代码有无限循环 模板
  • 角度错误:没有 NgControl 的提供者

    我正在创建一个实现 ControlValueAccessor 的组件 以在响应式表单中使用 它只是输入元素的包装器 上面有一些管道 我注入了 NgControl 以便检索有效 无效状态并将它们传播到内部输入元素 当在另一个输入中找到输入值时
  • 无法在角度2中实现PUT请求,出现错误“不允许空值”

    我已经在我的应用程序中实现了 GET 请求 并且能够在账户组件 当我单击中的特定行时DataGrid 我得到一个POPUP我可以在其中访问 row data 的窗口 并使用下拉菜单可以更新 DataGrid 但是 当我为下拉列表选择所需的值

随机推荐

  • 为简单的 hadoop mapreduce 作业运行两个映射器和两个减速器

    我只是想更好地了解如何使用多个映射器和化简器 我想使用一个简单的 hadoop mapreduce 字数统计作业来尝试一下 我想为这个字数统计作业运行两个映射器和两个化简器 我是否需要这样做在配置文件上手动配置 或者仅对 WordCount
  • 为简单的 hadoop mapreduce 作业运行两个映射器和两个减速器

    我只是想更好地了解如何使用多个映射器和化简器 我想使用一个简单的 hadoop mapreduce 字数统计作业来尝试一下 我想为这个字数统计作业运行两个映射器和两个化简器 我是否需要这样做在配置文件上手动配置 或者仅对 WordCount
  • React Native 应用程序 - 在 Android 8 真实设备上启动时崩溃/关闭

    我有一个 React Native 项目 不是 Expo 初始化为react native init myapp 我可以在装有 Android 5 的模拟器和真实设备上运行此应用程序 但无法在装有 Android 8 的 Android 手
  • React Native 应用程序 - 在 Android 8 真实设备上启动时崩溃/关闭

    我有一个 React Native 项目 不是 Expo 初始化为react native init myapp 我可以在装有 Android 5 的模拟器和真实设备上运行此应用程序 但无法在装有 Android 8 的 Android 手
  • 是否可以导出为 CSV 并让标题包含空格?

    我需要将 SSRS 2005 报告导出为 CSV 其中列标题包含空格 目前 CSV 标题列标题源自 textBox 属性名称 并使用下划线而不是空格 还有其他更好的方法吗 例如 目前我有 SSRS 报告标题 生效日期 文本框名称 生效日期
  • 是否可以导出为 CSV 并让标题包含空格?

    我需要将 SSRS 2005 报告导出为 CSV 其中列标题包含空格 目前 CSV 标题列标题源自 textBox 属性名称 并使用下划线而不是空格 还有其他更好的方法吗 例如 目前我有 SSRS 报告标题 生效日期 文本框名称 生效日期
  • 小数可以表示的第二个最小值是多少?

    什么是第二个最小值值一个decimal可以代表吗 该值大于Decimal MinValue并且小于任何其他值decimal可以代表 在C 中如何获取这个值 谢谢 第二个最小值是Decimal MinValue 1 这可以从文档中推断出dec
  • 小数可以表示的第二个最小值是多少?

    什么是第二个最小值值一个decimal可以代表吗 该值大于Decimal MinValue并且小于任何其他值decimal可以代表 在C 中如何获取这个值 谢谢 第二个最小值是Decimal MinValue 1 这可以从文档中推断出dec
  • 让qmake默认使用qt5

    我的 Linux 系统上有 qt4 和 qt5 默认使用qt4 有什么干净的方法可以改变它 以便 qmake 默认使用 qmake qt5 系统可能有不同的元包来处理默认值 例如在 Debian 上有一个qt4 default and a
  • 让qmake默认使用qt5

    我的 Linux 系统上有 qt4 和 qt5 默认使用qt4 有什么干净的方法可以改变它 以便 qmake 默认使用 qmake qt5 系统可能有不同的元包来处理默认值 例如在 Debian 上有一个qt4 default and a
  • 在 ember.js 中定义多分段 catch all 路由

    我正在使用 Ember js 我想创建一个捕获所有路由 以便在用户导航到与资源不匹配的 URL 时将其发送回应用程序的根目录 我正在使用历史API 我已经这样实现了 App Router map function this resource
  • 在 ember.js 中定义多分段 catch all 路由

    我正在使用 Ember js 我想创建一个捕获所有路由 以便在用户导航到与资源不匹配的 URL 时将其发送回应用程序的根目录 我正在使用历史API 我已经这样实现了 App Router map function this resource
  • 用于强制 .NET 应用程序以 32 位运行的环境变量

    有人告诉我 您可以设置一个环境变量来强制 NET 应用程序在 x64 版本的 Windows 上作为 32 位应用程序运行 你知道它是什么 或者知道它的参考资料吗 恐怕我的 google fu 今天让我失望了 或者它不存在 我正在使用 Re
  • 用于强制 .NET 应用程序以 32 位运行的环境变量

    有人告诉我 您可以设置一个环境变量来强制 NET 应用程序在 x64 版本的 Windows 上作为 32 位应用程序运行 你知道它是什么 或者知道它的参考资料吗 恐怕我的 google fu 今天让我失望了 或者它不存在 我正在使用 Re
  • 发出 axios get 请求时出现无限循环

    当我使用 Axios 向 api 发出 get 请求时 我在 useEffect 挂钩中遇到无限循环 并且我确信添加第二个选项 会告诉它只运行一次 有什么我遗漏或忽视的吗 console log 向我显示它正在无限循环 import Rea
  • 发出 axios get 请求时出现无限循环

    当我使用 Axios 向 api 发出 get 请求时 我在 useEffect 挂钩中遇到无限循环 并且我确信添加第二个选项 会告诉它只运行一次 有什么我遗漏或忽视的吗 console log 向我显示它正在无限循环 import Rea
  • Joomla 2.5 JFactory::getSession();似乎是在 Firefox 中缓存

    我的includes目录中有一个php文件 它的用途是显示验证码图像 在该文件中 我设置了一个会话变量 如下所示 code codegenerator session JFactory getSession session gt set s
  • Joomla 2.5 JFactory::getSession();似乎是在 Firefox 中缓存

    我的includes目录中有一个php文件 它的用途是显示验证码图像 在该文件中 我设置了一个会话变量 如下所示 code codegenerator session JFactory getSession session gt set s
  • Angular 4 投射http响应的正确方法

    我在 Angular 4 中创建了一个服务 并使用以下代码通过 REST JSON Angular 的新功能 获取数据 界面 export interface IItem Id number Title string Service imp
  • Angular 4 投射http响应的正确方法

    我在 Angular 4 中创建了一个服务 并使用以下代码通过 REST JSON Angular 的新功能 获取数据 界面 export interface IItem Id number Title string Service imp