Подтвердить что ты не робот

Typescript и оператор распространения?

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

foo(...args);

Почему я получаю эту ошибку в Typescript Playground???

Поставляемые параметры не соответствуют любой сигнатуре целевого вызова.

4b9b3361

Ответ 1

Итак, есть небольшая оговорка, которую вы, возможно, пропустили:

Для проверки типа требуется, чтобы элементы спреда соответствовали параметру отдыха.

Без Rest Paramater

Но вы можете использовать утверждение типа, чтобы перейти в динамический... и он преобразуется обратно в ES5/ES3 для вас:

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

(<any>foo)(...args);

В результате получается тот же вызов функции apply, который вы ожидаете:

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

С параметром останова

Альтернативой является то, что все работает так же, как вы ожидаете, примет ли функция параметр отдыха.

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

foo(...args);

Ответ 2

Я думаю, что @Fenton объясняет это очень хорошо, но я хотел бы добавить дополнительную документацию и возможные решения.

Решения:

Перегрузка функции. Я предпочитаю это решение в этом случае, потому что он сохраняет какой-то тип безопасности и избегает игнорировать и любой. Оригинальный вызов метода и функции вообще не нужно переписывать.

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

foo(...args);

Используйте @ts-ignore, чтобы игнорировать определенную строку, TypeScript 2.3

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

Использовать как есть.

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

(foo as any)(...args);

Ссылка на документацию относительно оператора распространения:

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html

Обсуждения по этому поводу:

https://github.com/Microsoft/TypeScript/issues/5296 https://github.com/Microsoft/TypeScript/issues/11780 https://github.com/Microsoft/TypeScript/issues/14981 https://github.com/Microsoft/TypeScript/issues/15375