angular - map 不是 Angular 5 中的函数
问题描述
我正在尝试获取两个日期之间的值。在服务器端它工作正常,但在前端它向我显示错误,因为birthdays.map 不是一个函数
生日服务.ts
import {Observable} from 'rxjs/Observable';
import * as moment from 'moment';
import 'rxjs/add/operator/map';
import {HttpClient, HttpParams} from '@angular/common/http';
import {map} from 'rxjs/operators';
getbirthdays(start?: moment.Moment, end?: moment.Moment):
Observable<birthday[]> {
let params = new HttpParams();
if (start) {
params = params.append('start', start.toISOString());
}
if (end) {
params = params.append('end', end.toISOString());
}
return this.http.get('/api/birthday', {params: params}).pipe(
map(res => res as Object[] || []),
map(birthdays => birthdays.map(k => new birthday(
k['_id'],
new Date(k['datetime']),
k['gift']))
)
);
}
浏览器控制台中的错误
core.js:1350 错误类型错误:birthdays.map 不是 MapSubscriber.project (birthday.service.ts:28) 中 MapSubscriber.webpackJsonp.../../../../rxjs/_esm5/internal 的函数/operators/map.js.MapSubscriber._next (map.js:35) 在 MapSubscriber.webpackJsonp.../../../../rxjs/_esm5/internal/Subscriber.js.Subscriber.next(订阅者。 js:54) 在 MapSubscriber.webpackJsonp.../../../../rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:41) 在 MapSubscriber.webpackJsonp... /../../../rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54) 在 MapSubscriber.webpackJsonp.../../../../rxjs/_esm5 /internal/operators/map.js.MapSubscriber._next (map.js:41) 在 MapSubscriber.webpackJsonp.../../../../rxjs/_esm5/internal/Subscriber.js.Subscriber.next ( Subscriber.js:54) 在 FilterSubscriber。webpackJsonp.../../../../rxjs/_esm5/internal/operators/filter.js.FilterSubscriber._next (filter.js:38) 在 FilterSubscriber.webpackJsonp.../../../ ../rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54) 在 MergeMapSubscriber.webpackJsonp.../../../../rxjs/_esm5/internal/operators/mergeMap。 js.MergeMapSubscriber.notifyNext
解决方案
Typescript 的类型检查仅适用于编译时,因为它最终编译为 JavaScript,所有类型仅供开发人员参考,因为 Typescript 没有运行时类型检查/强制转换功能
这就是为什么map(res => res as Object[] || [])
不会将响应投射到Array
它只会告诉 IDE 响应数据是什么类型(仅供您参考),它不会修改数据本身(您可以将 res 定义为Object[]
,但如果后端发送给您,Object
无论如何你都会得到相同的对象。
如果你想使用Array.prototype.map
你需要手动解析对 的响应Array
。
你应该删除第一个map()
,因为它什么都不做,并debugger;
在第二个中设置,看看你得到了什么数据。
推荐阅读
- python - Python函数:为什么我们可以在函数中定义变量/对象之前引用它?
- visual-studio-code - [VsCode 远程 SSH]如何解决“无法建立与 XXX.XXX.XXX.XXX 的连接:下载 VS Code 服务器失败”?
- node.js - 我无法正确发送正文
- amazon-web-services - 仅从一台设备下载 S3 速度极慢
- java - 如何使用 Timer 或 Thread.sleep() 在 Java swing GUI 中以不同的延迟多次更改我的 JLabel 文本
- swift - 在核心数据中创建目录和文件类似结构
- node.js - Node-ssh 不是构造函数?我该如何解决这个问题?
- sql - 如何通过sql中的分支获取最大计数transaction_id的最后日期
- amazon-web-services - 如何使用 AWS 中的自动化将 github 存储库复制到 S3 存储桶 (quickstart-git2s3)?
- node.js - 如何从 Hapi 的 GridFS-Stream 库返回 Stream 作为响应?