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
行代码给我以下错误:类型[...]中缺少属性date
在我的场景中,我需要使用spread运算符通过一个额外的prop扩展todo对象。但是我不确定为什么会看到此错误以及如何处理该错误...而且我也无法将date
with ?
运算符设为可选。
在此先非常感谢您指出为什么我的方案不起作用以及如何使其起作用!
您尝试做的事情是错误的,因为您不考虑封装。_date
是一个私有字段,不应在对象外部访问。您定义了吸气剂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(),
});
非常感谢您的解释!