Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 在构造函数调用中初始化类属性并进行分解_Typescript - Fatal编程技术网

Typescript 在构造函数调用中初始化类属性并进行分解

Typescript 在构造函数调用中初始化类属性并进行分解,typescript,Typescript,在TypeScript 3.6.3中,我似乎无法使用解构赋值来初始化构造函数中的类属性,即使传递的对象符合适当的接口。有没有办法做到这一点,或者有没有很好的理由来解释为什么不允许这样做 interface TestInt { name: string, name2: string } class TestClass { name: string name2: string constructor(t: TestInt){ {this.name,

在TypeScript 3.6.3中,我似乎无法使用解构赋值来初始化构造函数中的类属性,即使传递的对象符合适当的接口。有没有办法做到这一点,或者有没有很好的理由来解释为什么不允许这样做

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类型的一些边缘案例

      因此,要使解构赋值有效,完全限定的变量名必须与右侧的变量名完全匹配?@Josh是的,如果希望语法在不使用冒号的情况下工作,则需要精确的dict键作为唯一有效的目标标识符。在链接上对此进行了一些讨论(以及设置特定属性时需要冒号)。因此,要使解构赋值有效,完全限定变量名必须与右侧的变量名完全匹配?@Josh Yes,如果希望语法在不使用冒号的情况下工作,您需要确切的dict密钥作为唯一有效的目标标识符。在链接上对此进行了一些讨论(以及设置特定属性时需要冒号)。