Typescript在对象中创建函数,返回接口的关联键的类型

ijxebb2r  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(131)

我想知道是否有一种方法可以在typescript中做到这一点。假设我有一个this接口:

interface Transaction {
   amount: number;
   order_date: Date;
   id: string;
}

我想创建一个名为Mapper的类型,它将把从外部API接收到的json的每个键Map到我自己的接口,例如:

const ExternalAPIMapper: Mapper = {
   amount: (raw_transaction) => raw_transaction.sale_amount,
   order_date: ({ transaction_date }) => dayjs(transaction_date, 'YYYY.MM.DD').toDate()),
   id: ({ transaction_id }) => transaction_id
}

我创建了以下类型:

type Mapper = Record<keyof Transaction, ((t: any) => any)>

但是这个类型的问题是我的函数可以返回任何类型,我希望被类型化的函数返回与键相关联的类型,这可能吗?
如果它工作的话,我可以Map任何外部API的JSON,只需要一个Map器和这个函数:

const mapNetworkTransaction = (
  object: Record<string, string>,
  mapper: Mapper,
): Transaction => {
  const txn = { };
  for (let i = 0; i < txnFields.length; i++) {
    const txnField = txnFields[i];
    const accessor = mapper[txnField];
    if (accessor) {
       txn[txnField] = accessor(object);
    }
  }
  return txn;
};
wh6knrhe

wh6knrhe1#

您应该改用mapped type

type Mapper = {
  [K in keyof Transaction]: (t: any) => Transaction[K]
}

这将生成如下所示的类型:

type Mapper = {
    amount: (t: any) => number;
    order_date: (t: any) => Date;
    id: (t: any) => string;
}

Playground

相关问题