将接口中的字段类型替换为 Promise
Posted
技术标签:
【中文标题】将接口中的字段类型替换为 Promise【英文标题】:Replace fields types in interfaces to promises 【发布时间】:2018-05-05 12:22:17 【问题描述】:Typescript 具有 Partial<Object>
类型,有助于使对象的所有字段都是可选的。
是否有可能以同样的方式创建一个泛型类型Promisify<Person>
来改变Person
类型:
interface Person
getName(): string;
getAge(): number;
到:
interface PromisifyPerson
getName(): Promise<string>;
getAge(): Promise<number>;
我有一个通过 Typescript 接口描述的同步 API,我的目标是创建 API 的异步版本,而无需重写我拥有的所有接口。这是另一个例子:
interface ApplicationApi
startApp(): void;
readFile(fileName): string;
type AsyncApplicationAPI = Async<ApplicationApi>
之后我希望 AsyncApplicationAPI 应该是这样的:
interface AsyncApplicationApi
startApp(): Promise<void>;
readFile(fileName): Promise<string>;
【问题讨论】:
为什么要将本地值包装在 Promise 中?这无缘无故地增加了额外的开销。 我有一个通过 Typescript 接口描述的 API。这是桌面应用程序的 API,几乎所有方法都是同步的。现在我必须为这个 API 创建一个远程客户端,并且我想重用已经存在的接口。但是远程客户端会以异步方式调用API。所以我考虑将同步 API 接口转换为异步接口,例如 `type AsyncApplicationAPI = Async` 我想我很困惑为什么你不会返回 API 调用中的所有值而不是每个 property (让我通过 ajax 获取此人的姓名。 .. 现在让我通过另一个 ajax 调用来获取同一个人的年龄)。如果我需要一个人,为什么不Promise<Person>
?
我刚刚添加了一些描述。我已经有大量的 API 接口,现在很难重写。我的目标是在不更改原始 API 的情况下创建一个异步版本的 API。
【参考方案1】:
我相信你可以创建它,尽管它可能需要一些工作。您可以简单地创建一个函数,该函数将遍历给定对象的每个属性,并返回一个相同的对象,除了包装在 Promises 中的数据成员和包装在返回 Promise 的新函数中的函数。当然,您将不得不担心细节,例如您是否希望所有对象属性的属性都包含在 Promise 中...
编辑:我的回答是这样你就可以传递一个对象的 instance 并获得一个承诺的 instance 回来。对于语言本身的一般类型,您可能无法做到这一点。
【讨论】:
是的,创建一个将对象中的所有字段替换为 Promises 的函数并不难。但是我的目标是创建基于另一种类型的类型。 啊,是的,好的。这是一个非常深入的问题。我猜你需要在编译器中从语言之外定义它。也许在他们的 Github 页面上更直接地向 Typescript 人提出一些建议? 不幸的是,他们的 github 页面说:这不是论坛 - 使用“***”来回答您的问题 嗯...有趣。好吧,如果不存在解决方案,它可以作为“功能请求”【参考方案2】:type Promisified<T> =
[K in keyof T]: T[K] extends (...args: any) => infer R ?
(...args: Parameters<T[K]>) => Promise<R> :
T;
或查看here。
【讨论】:
以上是关于将接口中的字段类型替换为 Promise的主要内容,如果未能解决你的问题,请参考以下文章