Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:使用扩展运算符返回未定义而添加到对象的getter。功能正常_Typescript - Fatal编程技术网

TypeScript:使用扩展运算符返回未定义而添加到对象的getter。功能正常

TypeScript:使用扩展运算符返回未定义而添加到对象的getter。功能正常,typescript,Typescript,我正在尝试向对象添加方法(我的用例:我从API获取JSON,并希望向对象添加功能)。然而,我的getter失败了。下面是TypeScript上行为的简化示例: let o = { a: 'a', } let oo = { ...o, b: 'b', fa() { return this.a }, fb() { return this.b }, get ga(): string { return this.a }, get gb(): string { return

我正在尝试向对象添加方法(我的用例:我从API获取JSON,并希望向对象添加功能)。然而,我的getter失败了。下面是TypeScript上行为的简化示例:

let o = {
  a: 'a',
}

let oo = {
  ...o,
  b: 'b',
  fa() { return this.a },
  fb() { return this.b },
  get ga(): string { return this.a },
  get gb(): string { return this.b },
}

console.log(`oo.a = ${oo.a}`)
console.log(`oo.b = ${oo.b}`)
console.log(`oo.fa() = ${oo.fa()}`)
console.log(`oo.fb() = ${oo.fb()}`)
console.log(`oo.ga = ${oo.ga}`)
console.log(`oo.gb = ${oo.gb}`)
输出:

[LOG]: "oo.a = a" 
[LOG]: "oo.b = b" 
[LOG]: "oo.fa() = a" 
[LOG]: "oo.fb() = b" 
[LOG]: "oo.ga = undefined" 
[LOG]: "oo.gb = b" 
为什么oo.ga没有定义

另外,我在getter上指定了返回类型,因为否则会出现以下错误:

'ga' implicitly has return type 'any' because it does not have a return type
annotation and is referenced directly or indirectly in one of its return expressions.

也不确定那里发生了什么。

这看起来像是TypeScript中的一个bug。您的代码(在JavaScript中可以正常工作)可以传输到:

let oo = Object.assign(Object.assign({}, o), {
  b: 'b',
  fa() {
    return this.a;
  },
  fb() {
    return this.b;
  },
  get ga() {
    return this.a;
  },
  get gb() {
    return this.b;
  }
});
问题在于
Object.assign
:使用
Object.assign
将导致在作为第二个(或更高版本)参数的对象上调用getter。因此,在创建
oo
对象时调用
.ga
属性getter,而不是在以后访问该属性以记录它时调用


const obj=Object.assign({},{get foo(){console.log('getter invoked');})@CertainPerformance,因此getter实际上不是所创建对象中的getter!!真奇怪!是否有此行为的规范/文档?@ShivamSingla这是TypeScript中的一个bug。它们应该是getter,但传输不正确。@我想这是vainlla JS中的问题。与“getter invoked”的代码snippedt一样,对象
obj
上没有getter
foo
。它只是一个值
未定义的普通属性(因为getter没有返回任何内容)。@ShivamSingla My snippet(在JS中)说明了传输代码的问题-getter作为第二个(或更多)参数传递给
对象时被调用。assign
。这就是JS中的工作原理——但是TypeScript错误地传输了扩展语法。传输的
对象.assign
不正确。@CertainPerformance Yeh,我正在为“JS中应该是这样工作的”创建规范。在这里找到-有
Get(from,nextKey)
在源对象上被调用/调用,从而成为源对象的getter。然后,使用
Set(to,nextKey,propValue,true)
直接分配值。