繁体   English   中英

打字稿。 使用扩展运算符创建新对象时键入错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM