我有此代码:
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]生成什么。
我的问题有两个方面:
考虑到JS中的相同代码具有不同的行为,这是否被认为是TypeScript中的错误?
是的,这肯定看起来像是与Typescript的对象散布语法转换有关的错误。编译的TS与JS的功能不同。
首先,您定义一个具有属性this
的x1
对象,该属性是一个吸气剂:
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);