TypeScript错误? `get`语法和`defineProperty`'s`get`之间的`this`区别

问题描述 投票:0回答:1

我有此代码:

var x = {
  x1: 5,
  x2: 7
};

var y = {
  ...x,
  _originalX2: x.x2,
  get x2() {
    console.log(this.x1);
    return 9;
  }
};
console.log(y.x2);

var z = {
  ...x,
  _originalX2: x.x2
};
Object.defineProperty(z, 'x2', {
  get: function() {
    console.log(this.x1);
    return 9;
  }
})
console.log(z.x2);

[当我在浏览器或NodeJS中以JavaScript形式运行时,得到输出:

5
9
5
9

当我运行与TypeScript相同的代码(请参见https://repl.it/repls/TornHomelyThing)时,我得到了输出:

undefined
9
5
9

[我也看到JS TS从[@ C0]生成什么。

我的问题有两个方面:

  1. 考虑到JS中的相同代码具有不同的行为,这是否被认为是TypeScript中的错误?
  2. 是否有充分的理由无法在TypeScript生成的JS中引用https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=22&pc=1#code/G4QwTgBAHhC8EG8oEYBcECsAaaAmdA7AL4DcAUGaJAJ5yJkQQB0LUODEA+gPZgCWAcz4A7EABsAGvihMoudowEBTAC54AFAEoEHRgGNuwgM7cxSpmO4D1KgBZ8js5JvKNGYVQFcwwiAE5XCCIyUjIDY1NzS2tqWVwXCioIAC86HUYWWQUuXkERcSlUGTkQ8gB5ACMAKyU9FSYAEyUAMxElAAUwbgAHJTAVanVknAByORGcBAhlFXRmz2E6vkMtejcIcJMzCysbe0cUBPWPFW9fAI4iIM0wwy2o3eS4hKA?或者,这是JS本身的错误吗?
javascript typescript this getter defineproperty
1个回答
1
投票

考虑到JS中的相同代码具有不同的行为,这是否被认为是TypeScript中的错误?

是的,这肯定看起来像是与Typescript的对象散布语法转换有关的错误。编译的TS与JS的功能不同。

首先,您定义一个具有属性thisx1对象,该属性是一个吸气剂:

y

因此,以后引用x2会导致调用getter。但是在编译的Typescript中,我们得到:

var y = {
  ...x, 
  _originalX2:x.x2, 
  get x2(){

这将导致getter被调用[-当在y.x2中作为第二个或多个参数传递的对象中时,getter被调用。调用getter时,var x = { x1: 5, x2: 7 }; var y = Object.assign( Object.assign({}, x), { _originalX2: x.x2, get x2() { console.log(this.x1); } } );指向第二个参数,这里是此对象:

Object.assign
没有this属性,因此它记录为{
  _originalX2: x.x2,
  get x2() {
    console.log(this.x1);
  }
}

x1记录在

之前

undefined完成,直到您到达undefined的下一行。作为一个最小的例子:

Object.assign

被错误地移植到

console.log(y.x2);

© www.soinside.com 2019 - 2024. All rights reserved.