【发布时间】:2017-09-18 06:46:08
【问题描述】:
我刚刚开始学习 Typescript,我已经迷失在一些对于 C# 开发人员来说听起来很奇怪的东西。
总结: Promise<WsIdSessionResponse> 返回一个与WsIdSessionResponse 类具有相同字段的变量,但它不是有效的WsIdSessionResponse 实例。
说来话长
我有这样的服务(我省略了对问题无用的东西)使用不是我编写的 JSON 网络服务:
export class WsIdSessionService {
constructor(private http: HttpClient) { }
doLoginAsync(user: string, pwd: string): Promise<WsIdSessionResponse> {
let params = new HttpParams();
params = params.append('username', user);
params = params.append('password', pwd);
return this.http.get<WsIdSessionResponse>(this.apiUrl, {params: params})
.toPromise());
};
WsIdSessionResponse类是这样的
export class WsIdSessionResponse {
public status: number;
public username: string;
public isOk(): boolean {
return this.status == 1;
}
}
当我从WsIdSessionService 检索数据时出现问题:
var idSvc = this.wsIdSession.doLoginAsync(user, pwd);
var t = idSvc.then(info => {
if (t.isOk()) {
// Do something here
}
}
当我执行t.isOk() 时,我收到一条错误消息,告诉我isOk() 不是函数!
什么?!?不是函数?是的,我的课堂上有这个功能!
在浪费了大量时间之后,我终于想试试这个代码
var idSvc = this.wsIdSession.doLoginAsync(user, pwd);
var t = idSvc.then(info => {
console.warn(`info is valid: ${info instanceof WsIdSessionResponse}`);
}
在这里我得到一个false 结果:所以返回的变量具有我需要的类的相同字段,但它不是该类的真实实例,这就是isOk() 函数无效的原因!
但这怎么可能?我的意思是,http.get<WsIdSessionResponse> 应该返回一个有效的WsIdSessionResponse 实例,或者最终是一个错误......我错了吗?
只是为了提供完整的信息:http.get<WsIdSessionResponse> 从返回纯 JSON 字符串的 url 获取数据。
这是预期的行为还是我做错了什么?
【问题讨论】:
-
看起来用户在使用 C# 背景时遇到了完全相同的问题。 TS 只是编译时出现类型错误的 JS。它不会对 JS 不期望的对象进行魔术变换。
标签: angular typescript