首页 > 解决方案 > 打字稿。使用扩展运算符创建新对象时出现类型错误

问题描述

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可选?操作。

非常感谢您提前指出为什么我的方案不起作用以及如何使它起作用!

标签: javascripttypescripttypes

解决方案


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

推荐阅读