繁体   English   中英

我如何让 typescript 根据 function2E977777777777777777777777777777777777777777777777777777777777777777777777777777777777BED18 的返回类型 functionC17A94F14Z 的返回类型来推断 function 的返回类型

[英]How do I get typescript to infer the return type of a function based on the return type on a function of its arguments

所以这个 function 应该接受满足interface TransactionActionModel的对象数组。 这意味着它们都必须有一个名为“save”的 function 接收interface SaveOptions

目前这个saveUsingTransaction function 的返回类型是Promise<any[]>

interface TransactionActionModel {
  save: ({ session }: SaveOptions) => any;
}


const saveUsingTransaction = async (
    newEntities: TransactionActionModel[]
  ) => {
    const returnsArray = [];
    // Create Transaction
    const session = mongoDBWrapper.client.startSession();
    try {
      // Start Transaction
      session.startTransaction({});

      for (const entity of newEntities) {
        const resolve = await entity.save({ session });
        returnsArray.push(resolve);
      }

      // End Transaction
      await session.commitTransaction();

      return returnsArray;
    } catch (error) {
      await session.abortTransaction();

      throw error;
    } finally {
      await session.endSession();
    }
  };

有没有办法让saveUsingTransaction的返回类型与我传递到saveUsingTransaction的实体上的保存 function 的返回类型相匹配。

For Example

const person = {
 phone: "0233224444",
 save: ({session}):Person => {
      return this
     }
}

const cat = {
 weight: "30kg",
 save: ({session}): Animal => {
      return this
     }
}

const results = saveUsingTransaction([person, cat])

the type on the results variable should be ==> "[Person, Animal]"

您的界面应该是通用的:

interface TransactionActionModel<T> {
  save: ({ session }: SaveOptions) => T;
}

以及您的 function:

const saveUsingTransaction = async <A extends TransactionActionModel<any>[]>(
  newEntities: [...A]
): { [K in keyof A]: ReturnType<A[K]["save"]> } => {

使用[...A]A推断为一个元组,然后通过映射其元素并将它们更改为它们保存 function 的返回类型,在返回类型中使用该元组。 TypeScript 将在[...A]的接口中推断泛型。

简化演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM