gpt4 book ai didi

javascript - 为什么从 JSON 文字到类型的转换不包括函数

转载 作者:行者123 更新时间:2023-11-30 16:06:42 25 4
gpt4 key购买 nike

我有一个像这样的模型类:

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() is not a function

当我将 JSON 文字对象转换为任务时,我得到了相同的结果。

let task: Task = <Task>{ name: "Make some coffee" }
task.completeTask(); // Results in error

我做错了什么吗?如何确保包含函数?

最佳答案

事实上,当您进行强制转换时,您并没有真正拥有您所强制转换的类型的实例。您只需声明一个具有文字形式的对象,而不是任务的实例。

如果它只是 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));
}

关于javascript - 为什么从 JSON 文字到类型的转换不包括函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com