在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
答案 0 :(得分:2)
解构工作正常;语句{name, name2} = t
将name
定义或分配为t.name
,将name2
定义为t.name2
。但是,由于您指的是this.name
和this.name2
,因此Typescript不会删除this.
并且无法执行分配。
您可以看到此数组的使用:
constructor(t: TestInt){
[this.name, this.name2] = [t.name, t.name2];
}
只要您在括号中加上赋值,您就可以看到它适用于详细的{name: this.name}
语法 。否则,Typescript将大括号视为一个块并将name
视为一个标签。
constructor(t: TestInt){
({name: this.name, name2: this.name2} = t);
}
尽管您可以使用Object.assign
将t
的属性分配给this
,但即使我们假设t
的所有属性都是按照定义存在。公平地说,如果t
在其原型链中仅包含name
或name2
,这是不安全的。
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
相关: