繁体   English   中英

为什么从JSON文字类型转换为不包含函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM