温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - TypeScript. Type error when creating new object with spread operator
javascript types typescript

javascript - TypeScript。

发布于 2020-03-28 23:30:30
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对象。但是我不确定为什么会看到此错误以及如何处理该错误...而且我也无法将datewith ?运算符设为可选

在此先非常感谢您指出为什么我的方案不起作用以及如何使其起作用!

查看更多

查看更多

提问者
Svyat
被浏览
56
Grégory NEUT 2020-01-31 18:03

您尝试做的事情是错误的,因为您不考虑封装。_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(),
});