首页 > 解决方案 > 打字稿中的映射函数类型可能吗?

问题描述

假设我在打字稿中有一个函数类型

interface ParseFn {
  (param: string): number;
}

有没有办法在 TypeScript 中映射函数类型?我可以做类似的事情吗

type Async<T> = {
  [P in keyof T]: Promise<T[P]>;
}

const myAsyncNumParser: Async<ParseFn> = ...

?

标签: javascripttypescript

解决方案


TypeScript 中的映射类型完全忽略调用和构造签名,因此它们不会做你想做的事。相反,您可以在 TypeScript 2.8 中引入的条件类型中使用类型推断。假设您想要获取一个函数类型T并返回一个新函数类型,该函数类型采用相同的参数但其返回类型包含在 中Promise<>,您可以这样做:

type Async<T extends (...args: any) => any> =
    T extends (...args: infer A) => infer R ? (...args: A) => Promise<R> : never;
type AsyncParseFn = Async<ParseFn>;
// type AsyncParseFn = (param: string) => Promise<number>

还调用了预定义的实用程序类型Parameters<T>,并ReturnType<T>使用此类条件类型来获取参数元组和函数类型的返回类型。如果您愿意,您可以使用它们:

type Async2<T extends (...args: any) => any> =
    (...args: Parameters<T>) => Promise<ReturnType<T>>;
type Async2ParseFn = Async<ParseFn>;
// type Async2ParseFn = (param: string) => Promise<number>

无论哪种方式都应该有效。好的,希望有帮助;祝你好运!

Playground 代码链接


推荐阅读