如何使用“p-waterfall”TypeScript 类型

cod*_*elt 5 typescript typescript-generics typescript-typings

我正在使用p-waterfall,我想知道如何使用提供的 TypeScript 类型。这是类型

declare namespace pWaterfall {
  type Task<ValueType, ReturnType> = (
    previousValue: ValueType
  ) => ReturnType | PromiseLike<ReturnType>;

  type InitialTask<ReturnType> = () => ReturnType | PromiseLike<ReturnType>;
}

declare const pWaterfall: {
    <ReturnType>(tasks: [pWaterfall.InitialTask<ReturnType>]): Promise<ReturnType>;
  <ValueType1, ReturnType>(
    tasks: [
      pWaterfall.InitialTask<ValueType1>,
      pWaterfall.Task<ValueType1, ReturnType>
    ]
  ): Promise<ReturnType>;
  <ValueType1, ValueType2, ReturnType>(
    tasks: [
      pWaterfall.InitialTask<ValueType1>,
      pWaterfall.Task<ValueType1, ValueType2>,
      pWaterfall.Task<ValueType2, ReturnType>
    ]
  ): Promise<ReturnType>;
  ...
Run Code Online (Sandbox Code Playgroud)

我把一个例子(下面的代码)放在一起,如果输入它真的可以帮助我理解如何让类型与p-waterfall一起工作。

import pWaterfall from "p-waterfall";

interface User {
  name: string;
}

const getItemsRequest = async (sliceCount: number): Promise<User[]> => {
  return [{ name: "a" }, { name: "b" }, { name: "c" }].slice(0, sliceCount);
};

const getNames = (results: User[]): string[] => {
  return results.map(item => item.name);
};

const countArrayLength = <T extends unknown[]>(results: T): number => {
  return results.length;
};

(async () => {
  const transformers = [getItemsRequest, getNames, countArrayLength];

  const shouldBeTypeNumberButIsUnknown = await pWaterfall(transformers, 2);

  console.log(`results`, shouldBeTypeNumberButIsUnknown); // 2
})();

Run Code Online (Sandbox Code Playgroud)

shouldBeTypeNumberButIsUnknown未知,但应该是number因为传入的最后一个函数pWaterfall返回一个数字。

Ped*_*o A 1

我已经为 p-waterfall 开了一个 PR,它可以让你轻松地做你想做的事情。看这里

同时,您可以使用两种解决方法:

  1. 你可以直接使用我的fork:

  2. 您可以transformers直接传递数组,而无需创建中间变量。这样 p-waterfall 就会得到正确的结果。参见 StackBlitz