如何将扩展运算符与“this”一起使用?

Posted

技术标签:

【中文标题】如何将扩展运算符与“this”一起使用?【英文标题】:How can I use the spread operator with 'this'? 【发布时间】:2019-01-17 06:01:17 【问题描述】:

我在 TypeScript 中定义一个类。 因此,使用扩展运算符我可以发出这样的问题:

class Foo 
  constructor(data: IDataStructure)
      const  ...k  = data; // and then k has taken over all the properties of data. Great!
  

  public render () 

    return(<div/>

   );
  

现在,我想做同样的事情,但不是将属性放在k 中,而是放在正在创建的当前对象中。 IE。我想做类似const ...this = data; 这样的事情在 Typescript 中有什么聪明的方法吗?

【问题讨论】:

... 不是(也不能是)操作员。这只是主要语法。 【参考方案1】:

您不能使用展开向现有 对象添加属性。目前没有 syntax 方法可以做到这一点;相反,使用Object.assign:

Object.assign(this, data);

示例(在 javascript 中)

class Example 
    constructor(data) 
        Object.assign(this, data);
    

const e = new Example(answer: 42);
console.log(e.answer); // 42

注意Object.assign 做了属性的浅拷贝。因此,如果data 的属性之一引用了一个对象,那么reference 会被复制过来,datathis 都将引用同一个对象:

const data = 
    answer: 67,
    obj: 
        prop: "value"
    
;
Object.assign(this, data);
console.log(this.obj === data.obj); // true, it's a shallow copy, they both refer
                                    // to the same object

如果您需要深度副本,其中复制data 也会复制data.obj,请参阅this question's answers。

【讨论】:

我刚刚发现它并没有真正起作用。它实际上是把你的课搞砸了。从那时起,每当您想通过“this”访问类的变量时,它都被搞砸了,因为“this”现在指向数据。 @Jose - 不,不是。 this 拥有 data 上内容的浅拷贝。我已在答案中添加了有关深度克隆的注释,但您的问题中没有任何内容表明您需要深度副本。

以上是关于如何将扩展运算符与“this”一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

React 的状态如何通过使用扩展运算符来保存文件?

ES6中的扩展运算符

在类方法与函数中使用扩展运算符

React 扩展运算符未知的支柱警告

在样式化组件中使用扩展运算符

在道具分配中使用扩展运算符时React Native收到错误:“在这种环境下,分配的目标必须是一个对象