我正在使用打字稿并编译到ES2016。我注意到我在this
中使用相似的Function.prototype.call()
对象调用了两个不同的函数。我尝试通过使用将在对象开头使用this
的通用对象来合并两个...spread
对象,例如
let selfShared = {
props,
// ...
};
let selfHost = {
...selfShared,
// ...
};
let selfGuest = {
...selfShared,
// ...
};
在乞讨中使用传播的想法是,如果我认为合适的话,我可以覆盖两个this
对象中的任何一个的共享属性。但是与使用传播在props
对象中直接设置this
时产生的怪异结果不同,这是因为tsc
将代码编译为
let selfShared = {
props
};
let selfHost = Object.assign(Object.assign({}, selfShared), {
// ...
});
// ...
使用我的代码
let state = undefined;
let attributes = {};
let selfShared = {
props: attributes
};
let selfHost = {
...selfHost,
get state() {
console.log("selfHost get state");
return state;
},
set state(originalStates) {
console.log("selfHost set state");
!state ? state = originalStates : console.error("`this.states` already defined in the host function.");
}
}
输出看起来像
let state = undefined;
let attributes = {};
let selfShared = {
props: attributes
};
let selfHost = Object.assign(
Object.assign({}, selfShared), {
get state() {
console.log("selfHost get state");
return state;
},
set state(originalStates) {
console.log("selfHost set state");
!state ? state = originalStates : console.error("`this.states` already defined in the host function.");
}
});
至少现在在firefox 74到77上,将两个代码都插入控制台并添加
// ...
selfHost.state = {
thing: "some"
};
selfHost.state = {
some: "thing"
};
抛出不同的日志...预编译的代码给了我两个set state
和一个错误,它们是预期的输出,但是编译的代码给了我一个get state
,并且忽略了set state
输出中的规则]
{ some: "thing" }
而不是预期的
{ thing: "some" }
与预编译的代码一样?
将展开设置为文件底部编译为
let selfHost = Object.assign({ get state() { console.log("selfHost get state"); return state; }, set state(originalStates) { console.log("selfHost set state"); !state ? state = originalStates : console.error("`this.states` already defined in the host function."); } }, selfShared);
给出正确的输出,但不允许我覆盖
selfShared
给定的属性。
您能解释一下为什么Object.assign
会发生这种情况吗,如果有一个技巧可以从tsc
中获得输出,但仍然可以让我执行我最初想要的操作?
我正在使用打字稿并编译到ES2016。我注意到我正在Function.prototype.call()中调用两个与此对象相似的不同函数。我试图通过使用...
使用点差时