[英]Why does casting from JSON literal to type not include functions
我有一个这样的模型类:
export class Task {
public name: string;
public status: string = "todo";
public completeTask(): void {
this.status = "done";
}
}
还有一个检索任务的服务:
export class TaskService {
constructor(private _http: Http) {}
public getTask(): Observable<Task> {
return this._http
.get("url")
.map(res => res.json().data as Task)
}
}
然后,当我尝试在任务上调用completeTask
函数时,出现错误消息:
TypeError:task.completeTask()不是函数
将JSON文字对象强制转换为任务时,会得到相同的结果。
let task: Task = <Task>{ name: "Make some coffee" }
task.completeTask(); // Results in error
难道我做错了什么? 如何确定包含功能?
实际上,当您进行转换时,实际上并没有所转换类型的实例。 您只能以文字形式声明一个对象,而不是task的实例。
如果这只是TypeScript提供的一种检查铸造对象是否遵循类型结构的方法。 但这不是仅在设计/编译时在运行时发生的事情。
如果您希望能够使用该类型的方法,则需要根据内容实例化一个新对象:
public getTask(): Observable<Task> {
return this._http
.get("url")
.map(res => {
let content = res.json().data;
let task = new Task();
task.name = content.name;
task.status = content.status;
return task;
});
}
有关更多详细信息,请参见此问题:
编辑
在@ssube的注释之后,您可以像下面这样声明Task
类:
export class Task {
(...)
constructor(obj:{name:string, status:string}) {
this.name = obj.name;
this.status = obj.status;
}
(...)
}
这样,实例化将更加容易:
public getTask(): Observable<Task> {
return this._http
.get("url")
.map(res => new Task(res.json().data));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.