Typescript 在构造函数调用中初始化类属性并进行分解
在TypeScript 3.6.3中,我似乎无法使用解构赋值来初始化构造函数中的类属性,即使传递的对象符合适当的接口。有没有办法做到这一点,或者有没有很好的理由来解释为什么不允许这样做Typescript 在构造函数调用中初始化类属性并进行分解,typescript,Typescript,在TypeScript 3.6.3中,我似乎无法使用解构赋值来初始化构造函数中的类属性,即使传递的对象符合适当的接口。有没有办法做到这一点,或者有没有很好的理由来解释为什么不允许这样做 interface TestInt { name: string, name2: string } class TestClass { name: string name2: string constructor(t: TestInt){ {this.name,
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
破坏工作很好;语句
{name,name2}=t
定义或赋值name
为t.name
和name2
为t.name2
。但是,由于您引用的是this.name
和this.name2
,因此Typescript不会删除this.
,并且无法执行赋值
您可以在阵列中看到这一点:
构造函数(t:TestInt){
[this.name,this.name2]=[t.name,t.name2];
}
只要将赋值插入括号中,就可以看到它与verbose{name:this.name}
语法一起工作。否则,Typescript将大括号视为一个块,name
视为一个标签
构造函数(t:TestInt){
({name:this.name,name2:this.name2}=t);
}
尽管您可以使用Object.assign
将t
的属性分配给此
,但即使我们假设所有t
的属性都按定义存在,也可以键入脚本。公平地说,如果t
仅通过原型链包含name
或name2
,这是不安全的
类Obj{
get name(){return'foo';}//与name='foo'比较,注意“name”冲突
}
类Obj2扩展了Obj{
get name2(){return'baz';}//与name2='bar'比较
}
设testClass=newtestclass(newobj2());
alert(`${testClass.name}${testClass.name2}`);
相关的:
- -与你的问题类似;答案描述了后一种语法
- -为什么不能在这里使用扩展运算符
- -有关Object.assign类型的一些边缘案例
- 解构工作正常;语句
{name,name2}=t
定义或赋值name
为t.name
和name2
为t.name2
。但是,由于您引用的是this.name
和this.name2
,因此Typescript不会删除this.
,并且无法执行赋值
您可以在阵列中看到这一点:
构造函数(t:TestInt){
[this.name,this.name2]=[t.name,t.name2];
}
只要将赋值插入括号中,就可以看到它与verbose{name:this.name}
语法一起工作。否则,Typescript将大括号视为一个块,name
视为一个标签
构造函数(t:TestInt){
({name:this.name,name2:this.name2}=t);
}
尽管您可以使用Object.assign
将t
的属性分配给此
,但即使我们假设所有t
的属性都按定义存在,也可以键入脚本。公平地说,如果t
仅通过原型链包含name
或name2
,这是不安全的
类Obj{
get name(){return'foo';}//与name='foo'比较,注意“name”冲突
}
类Obj2扩展了Obj{
get name2(){return'baz';}//与name2='bar'比较
}
设testClass=newtestclass(newobj2());
alert(`${testClass.name}${testClass.name2}`);
相关的:
- -与你的问题类似;答案描述了后一种语法
- -为什么不能在这里使用扩展运算符
- -有关Object.assign类型的一些边缘案例