在构造函数调用中使用析构函数初始化Class属性

时间:2019-09-25 02:05:16

标签: typescript

在TypeScript 3.6.3中,即使传递的对象符合适当的接口,似乎我也无法使用结构化分配来初始化构造函数中的Class属性。有没有办法实现这一目标,或者有一个合理的理由可以解释为什么不允许这样做?

interface TestInt {
    name: string,
    name2: string
}

class TestClass {
    name: string
    name2: string
  constructor(t: TestInt){   
    {this.name, this.name2} = t
  }
}

// static errors: 
// Property 'name' has no initializer and is not definitely assigned in the constructor.
// Property 'name' is used before being assigned.

let a = new TestClass({name: 'mom', name2:'dad'})
console.log(a.name)
console.log(a.name2)

// undefined
// undefined

1 个答案:

答案 0 :(得分:2)

解构工作正常;语句{name, name2} = tname定义或分配为t.name,将name2定义为t.name2。但是,由于您指的是this.namethis.name2,因此Typescript不会删除this.并且无法执行分配。

您可以看到此数组的使用:

constructor(t: TestInt){   
  [this.name, this.name2] = [t.name, t.name2];
}

typescript playground

只要您在括号中加上赋值,您就可以看到它适用于详细的{name: this.name}语法 。否则,Typescript将大括号视为一个块并将name视为一个标签。

constructor(t: TestInt){   
  ({name: this.name, name2: this.name2} = t);
}

typescript playground

尽管您可以使用Object.assignt的属性分配给this,但即使我们假设t的所有属性都是按照定义存在。公平地说,如果t在其原型链中仅包含namename2,这是不安全的。

class Obj {
  get name() { return 'foo'; }   // compare with name = 'foo', noting "name" collision
}

class Obj2 extends Obj {
  get name2() { return 'baz'; }  // compare with name2 = 'bar'
}

let testClass = new TestClass(new Obj2());
window.alert(`${testClass.name} ${testClass.name2}`);

does not correctly infer that all properties of TestClass are definitely assigned

相关: