javascript - 打字稿中的映射函数类型可能吗?
问题描述
假设我在打字稿中有一个函数类型
interface ParseFn {
(param: string): number;
}
有没有办法在 TypeScript 中映射函数类型?我可以做类似的事情吗
type Async<T> = {
[P in keyof T]: Promise<T[P]>;
}
const myAsyncNumParser: Async<ParseFn> = ...
?
解决方案
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>
无论哪种方式都应该有效。好的,希望有帮助;祝你好运!
推荐阅读
- java - 包文件夹在哪里?那应该存储在android设备中吗?
- javascript - select2,无法选择 AJAX 结果
- java - 从firebase获取坐标以绘制折线
- javascript - 将 JavaScript 变量发送到 PHP
- java - 用户输入不是调用方法(Java)
- python - 如何使用 distinct() 为 Django ListView 中的每个标题项仅显示来自子模型的一条记录
- permissions - docker-compose 命令执行问题 - 在 /var/www/ 中设置权限
- ruby-on-rails - Rails 语言持久化?语言环境总是路由到 default_locale
- powershell - PowerShell:将 16MB CSV 导入 PowerShell 变量会创建 >600MB 的 PowerShell 内存使用量
- c++ - 如何在 C++ 中通过多种类型从元组中选择多个元素?