我想使用析构从现有对象创建一个新对象。
在JS中,我执行以下操作:
const objOrig = { a: 1, b:2, c: 3};
const objChanged = { ...({a, c} = objOrig), ...{b:'S'} };
// => objChanged is: { a: 1, b: 'S', c: 3 }
如果我想对TS做同样的处理,我会得到:TS18004:速记属性"a"的范围内不存在值。请声明一个值或提供初始值设定项。
type S = {a: number; b: number| string; c: number};
const objOrig: S = { a: 1, b: 2, c: 3};
const objChanged: S = { ...({a, c} = objOrig), ...{b:'S'} }
如果TS真的是JS的超集,那么它应该是可能的,所以:我做错了什么?
(Playground链接)
2条答案
按热度按时间s5a0g9ez1#
JS代码的问题在于它实际上声明了两个全局变量
a
和c
:打开严格模式,看到它在JavaScript中失败:
更改对象的正确方法如下:
但由于只更改了一个属性,因此可以简化为:
Playground
z0qdvdin2#
正如vera所说,JS代码很容易被误解。
也许我的例子太简单了,objChanged也应该是一个不同的TS类型。
我能够解决我的问题如下。
再次感谢您的回复。