打字稿中的映射函数类型可能吗?

时间:2020-02-02 00:49:06

标签: javascript typescript

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

results <- regmatches(x, regexec(regex, x, perl=TRUE))
unlist(lapply(results, function(x) paste(x[-1], collapse="")))
## => [1] "reduced" ""        "reduced" "" 

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

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

1 个答案:

答案 0 :(得分:1)

Mapped types在TypeScript中完全忽略了调用并构造了签名,因此它们不会做您想要的事情。相反,您可以使用TypeScript 2.8中引入的type inference in conditional types。假设您要获取一个函数类型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 link to code