为什么我不能动态创建属性?

时间:2019-11-11 05:09:21

标签: javascript typescript

我刚接触打字稿,只是一个问题。我们知道我们可以在javascript中动态定义一个属性,如下所示:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

但是使用打字稿时我们不能做同样的事情:

class Rectangle {
  constructor(height:number, width:number) {
    this.height = height;   //error 
    this.width = width;     //error 
  }
}

我知道,如果在构造函数中将诸如pubic之类的访问标识符添加为参数的前缀,则为:

 ...
 constructor(public height:number, public width:number) {...}  //which create declaration automatically

将解决此问题,但是我只是想知道,这不是JavaScript的超集吗?所以打字稿也应该支持所有有效的JavaScript语法?

3 个答案:

答案 0 :(得分:3)

  

这是JavaScript的严格语法超集,并为该语言添加了可选的静态类型

要注意的另一件事是,诸如非强类型功能或类似内容之类的功能在TypeScript中将不起作用,这种现象与之相似。

答案 1 :(得分:1)

以下是TS解释的流程。

  1. 所有属性,方法都已初始化。
  2. 然后在实例化期间,调用构造函数,并使用默认值设置以上属性。

在您的代码中:

class Rectangle {
  constructor(height:number, width:number) {
    this.height = height;   //error 
    this.width = width;     //error 
  }
}

没有提到任何属性,因此会出现错误

答案 2 :(得分:0)

您可以做到,但您当然会与该语言的类型检查功能作斗争。

class Rectangle {
  constructor(height:number, width:number) {
    (this as any).height = height;
    (this as any).width = width;
  }
}

const rt = new Rectangle(100, 200);
console.log((rt as any).width);

也就是说,如果您强制转换为任意一个,就可以像使用普通JavaScript一样执行所有操作。