将接口中的字段类型替换为 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&lt;Person&gt; 我刚刚添加了一些描述。我已经有大量的 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的主要内容,如果未能解决你的问题,请参考以下文章

mysql 数据库 列表中的字段前如何批量添加指定字符?

sql替换数据库字段中的字符

如何对sql数据库中的某一字段进行替换?

mysql数据库某个字段的所有值匹配替换

求SQL语句,一个字段中多个ID,如何对他进行对应的值替换?

使用接口更改已装箱的值类型中的字段