javascript - 打字稿。使用扩展运算符创建新对象时出现类型错误
问题描述
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
在我的场景中,我需要使用扩展运算符来扩展 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(),
});
推荐阅读
- wpf - 如何修复“InvalidOperationException:必须在 ShaderEffect 上设置 PixelShader”VS2017 错误?
- json - 使用引用验证 Json 架构
- scala - 无法在 playframework 2.6.17 中解析 mock[....]
- android - 将参数传递给 strings.xml ANDROID 中的字体大小
- typescript - 打字稿类创建多次调用
- mysql - 上一年的 SQL 运行总计
- python - Pandas - 在 CSV 文件的不同列中找到相同值的更快方法?
- freeswitch - 有没有可能我可以知道谁在 FreeSwitch 中发言?
- java - 使用列表参数将 HQL 查询转换为可执行的 SQL 查询
- c# - 如何检查设备是否已加入 AD 或 Azure AD 已加入/注册?