function foo(x:number, y:number, z:number) {
console.log(x,y,z);
}
var args:number[] = [0, 1, 2];
foo(...args);
Почему я получаю эту ошибку в Typescript Playground???
Поставляемые параметры не соответствуют любой сигнатуре целевого вызова.
function foo(x:number, y:number, z:number) {
console.log(x,y,z);
}
var args:number[] = [0, 1, 2];
foo(...args);
Почему я получаю эту ошибку в Typescript Playground???
Поставляемые параметры не соответствуют любой сигнатуре целевого вызова.
Итак, есть небольшая оговорка, которую вы, возможно, пропустили:
Для проверки типа требуется, чтобы элементы спреда соответствовали параметру отдыха.
Но вы можете использовать утверждение типа, чтобы перейти в динамический... и он преобразуется обратно в 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);
Я думаю, что @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