使用 Typescript 展开运算符导致编译错误

Using Typescript spread operator results in compile error

将 VS17RC 与 TS 2.1 结合使用

function foo(x:number, y:number, z:number) { console.log(x + y + z)}
var args = [0, 1, 2];
foo(...args);

给出编译时错误"Supplied parameters do not match any signature of call target."

这是编译后的js:

function foo(x, y, z) { console.log(x + y + z); }
var args = [0, 1, 2];
foo.apply(void 0, args);

这确实有效。

我这里有什么地方做错了吗?

示例来自这里:Typescript Deep Dive

完全相同的示例存在未解决的问题:
Compiler incorrectly reports parameter/call target signature mismatch when using the spread operator

该问题被标记为 bug,但它从 2015 年 8 月 3 日开始存在,并且没有设置里程碑。

这是我的解决方法:

/**
 * Function definition
 */
class SockService {
  connect(...args:Array<string>) {
    if (args.length > 1) {
      [this.host, this.path] = args;
    }
  }
}

/**
 * Function usage
 */
var endpoint = {
  'local_test': [] as Array<string>,
  'local': ['0.0.0.0:8080', '/foo/websocket'],
  'production': ['192.0.2.1:8080', '/foo/websocket']
};

this.sock.connect(...endpoint.local_test);

我不喜欢像这样使用剩余参数,因为它会使函数定义的描述性大大降低。但这是我在 TypeScript 中使用函数参数的唯一方式。