我有一个使用这些导入定义的服务:
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs/Observable";
import "rxjs/add/operator/map";
import { Subject } from "rxjs/Subject";
import { Navigation } from "../Shared/app.home";
import { Module } from "../Shared/app.home";
然后在服务中我定义了一个方法:
getNavigationModules(): Observable<Navigation[]> {
return this.http.get<Module[]>("/api/modules/getuserpreferences").map((mods) => {
return mods.map(m => {
var nav = new Navigation();
nav.id = m.Id;
nav.name = m.Name;
nav.isFavorite = m.IsFavorite;
nav.url = m.FriendlyUrl;
nav.status = (m.ModuleProperties["Status"] != null && m.ModuleProperties["Status"] === "Online") ? "on" : "off" ;
nav.type = m.Type;
return nav;
});
});
}
调用该方法时,我得到映射未定义的错误。 当调用mods.map我假设通过调用http.get来mods将是一个Module数组,但是当我使用调试器(Chrome)时,我看到调试器将mod视为具有属性Module的Object,这个是Module阵列。
但如果我将代码更改为mods.Modules.map,编译时会出错,因为mods实际上是Module []而不是对象。
我错过了什么?
由于
答案 0 :(得分:2)
你告诉TypeScript后端将发回的是一个Module数组。但事实并非如此。它是一个对象,有一个名为Modules
的字段,它是一个Module数组。所以告诉TypeScript正确的事情:
getNavigationModules(): Observable<Navigation[]> {
return this.http.get<{Modules: Module[];}>("/api/modules/getuserpreferences").map((mods) => {
return mods.Modules.map(m => {
var nav = new Navigation();
nav.id = m.Id;
nav.name = m.Name;
nav.isFavorite = m.IsFavorite;
nav.url = m.FriendlyUrl;
nav.status = (m.ModuleProperties["Status"] != null && m.ModuleProperties["Status"] === "Online") ? "on" : "off" ;
nav.type = m.Type;
return nav;
});
});
}