[英]Is it possible to update an object using spread operator, not creating new one?
[英]TypeScript. Type error when creating new object with spread operator
class Todo {
private _date: Date;
public name: string;
constructor(todo: Todo) {
this._date = todo._date;
this.name = todo.name;
}
get date() { ... }
}
// example
const todos = Agent.fetchTodos();
const modifiedTodos1 = map.todos(todo => new Todo(todo)); // works fine
const modifiedTodos2 = map.todos(todo => new Todo( { ...todo, _date: new Date() } )); // doesn't work
第二行modifiedTodos2
Todos2 代码给了我以下错误:属性date
在类型 [...] 中丢失
在我的场景中,我需要使用扩展运算符来扩展带有附加道具的 todo 对象。 但我不知道为什么我看到这个错误,以及如何处理呢......我还不能做出date
可选?
操作员。
非常感谢您指出为什么我的场景不起作用以及如何使它起作用!
您尝试做的事情是错误的,因为您没有考虑封装。 _date
是一个私有字段,不应在对象外部访问。 您定义了 getter date
,使用它。
你不应该使用
this._date = todo._date;
但
this._date = todo.date;
.
这是一个例子:
class Todo {
private _date: Date;
public name: string;
constructor(todo) {
this._date = todo.date;
this.name = todo.name;
}
get date(): Date {
return this._date;
}
}
const todo = new Todo(null);
const modifiedTodos1 = new Todo(todo);
const modifiedTodos2 = new Todo({
...todo,
date: new Date(),
});
另请注意,如果您在构造函数中强输入todo
,则它将不起作用,例如:
constructor(todo: Todo) {
this._date = todo.date;
this.name = todo.name;
}
因为打字稿正在等待您未使用扩展运算符(无日期函数)提供的Todo
对象。
为了解决这个问题,我建议你指定一个只包含你的 setter 数据的接口。
interface ITodo {
date: Date,
name: string,
}
class Todo {
private _date: Date;
public name: string;
constructor(todo: ITodo) {
this._date = todo.date;
this.name = todo.name;
}
get date(): Date {
return this._date;
}
}
const todo = new Todo(null);
const modifiedTodos1 = new Todo(todo);
const modifiedTodos2 = new Todo({
...todo,
date: new Date(),
});
除了之前的答案。 除了接口,您可以使用类型:
declare type TodoType ={
name:string,
date:Date
}
class Todo {
private _date: Date;
public name: string;
constructor(todo: TodoType) {
this._date = todo.date;
this.name = todo.name;
}
otherBehavior = ()=> {}
get date() { return this._date;}
}
const toDos:Array<Todo> = [];
const modifiedTodos2 = toDos.map(todo => new Todo( { ...todo, date: new Date() } ));
这样你就可以向你的Todo
类添加额外的行为(属性/方法),并且不需要在你传递的对象中传递这些来创建Todo
实例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.