Вы получаете это, поскольку 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>));