首页 > 解决方案 > 打字稿泛型类型未知参数计数

问题描述

我正在尝试使用泛型类型创建一个函数,该函数接受一个函数、一个其参数数组,然后将它们应用于它,但 typescript 不能正确解释 args 类型

  const animate = async <P, A>(
    action: (payload: P) => any,
    algorithm: (...args: A[]) => P[],
    args: A[]
  ) => {
    if (state.playing) return;
    dispatch(togglePlaying());
    const sequence = algorithm(...args);
    for (let element of sequence) {
      await delay(1);
      dispatch(action(element));
    }
    dispatch(togglePlaying());
  };

这是我尝试使用它时遇到的错误

'(rows: number, cols: number, startCell: Coordinates, endCell: Coordinates) => GridT[]' 类型的参数不能分配给 '(...args: (number | Coordinates)[]) = > 网格[]'

标签: typescriptfunctiongenericsarguments

解决方案


您需要的是Parameters<Type>类型:https ://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype

从函数类型 Type 的参数中使用的类型构造元组类型。

然后,您可以像这样定义您的函数:

const animate = async <P, F extends (...args: any[]) => P[]>(
    action: (payload: P) => any,
    algorithm: F,
    args: Parameters<F>
) => {
    // blah
}

正如您的错误消息所示,如果您定义algorithmas的类型(...args: A[]) => P[],您实际上是在说每个参数都是相同的类型(在您的情况下number | Coordinates),所以当您尝试传入一个类型的函数时(rows: number, cols: number, startCell: Coordinates, endCell: Coordinates) => GridT[]它不匹配。


推荐阅读