Передайте params для работы с помощью объекта, распространяющего объект params, который не работает - PullRequest
2 голосов
/ 03 августа 2020

Я хочу передать все параметры этой функции, распространяя объект params как этот SO-ответ :

public showToast(
    content: string,
    buttonLabel = 'Ok',
    hideDelay?: number,
    buttonAction?: Function,
    uniqueKey?: string,
    canBeCleared?: boolean,
    templateCtrl?: Object
): Toast {
    const toast = new Toast(
        content,
        this,
        buttonLabel,
        hideDelay,
        buttonAction,
        uniqueKey,
        canBeCleared,
        templateCtrl
    );
    toast.id = !this.lastToast ? 1 : this.lastToast.id + 1;
    this.toasts.push(toast);
    toast.top = toast.fromTop;

    // hiding is handled in the ToastComponent
    return toast;
}

Моя попытка:

const toastArgs = {
    content: 'test toast',
    buttonLabel: 'test button',
    hideDelay: 1000,
    buttonAction: () => 5,
    uniqueKey: 'uk',
    canBeCleared: true,
    templateCtrl: { strl: 3 }
};
service.showToast(...Object.values(toastArgs));

Ошибка времени компиляции:

Ожидается 1-7 аргументов, но получено 0 или более .ts (2556) toast.service.ts (18, 9): аргумент для 'content' не был предоставляется.

Почему я получаю эту ошибку? Я последовал такому ответу.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы получаете это, поскольку Object.values(toastArgs) выводится как:

(true | "test toast" | "test button" | 1000 | (() => number) | "uk" | {
    readonly strl: 3;
})[]

Типографский скрипт не имеет понятия «длина» массива. Что касается машинописного текста, то toastArgs может быть { x: true }, и это будет соответствовать типу Object.values(toastArgs). Вы можете проверить это следующим образом:

const toastArgsValid = {
  content: 'test toast',
  buttonLabel: 'test button',
  hideDelay: 1000,
  buttonAction: () => 5,
  uniqueKey: 'uk',
  canBeCleared: true,
  templateCtrl: {strl: 3},
};

const toastArgsValuesValid = Object.values(toastArgsValid);

type ToastParamsValid = typeof toastArgsValuesValid;

const toastArgsInvalid = {
  x: true,
};

const toastArgsValuesInvalid: ToastParamsValid = Object.values(
  toastArgsInvalid,
); // No error here since the invalid type is a subtype of the valid type

Один из способов добиться того, что вы ищете, - это рефакторинг вашего метода showToast, чтобы вместо этого использовать один объект вместо позиционных аргументов:

public showToast({
  content,
  buttonLabel,
  hideDelay,
  buttonAction,
  uniqueKey,
  canBeCleared,
  templateCtrl,
}: {
  content: string;
  buttonLabel: string;
  hideDelay?: number;
  buttonAction?: Function;
  uniqueKey?: string;
  canBeCleared?: boolean;
  templateCtrl?: Object;
}): Toast {
 // function body
}

Затем вы можете позвонить:

service.showToast(toastArgs)

В качестве альтернативы вы также можете использовать утверждение типа без рефакторинга кода, например:

service.showToast(...(Object.values(toastArgs) as Parameters<typeof service.showToast>));
0 голосов
/ 04 августа 2020

Object.values() поддерживается с es2017, ECMAScript_2017 . И целевая версия TypeScript по умолчанию - ES3. Ошибку можно исправить, просто добавив параметр компилятора --target es2017.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...