我现在使用访问者模式,其中我有两个访问者使用相同的接口返回T.它基本上看起来像下面的架构,但我的访问者返回一些东西.

我想将我的一个访问者的返回类型更改为返回promise .

我是否应该为此问题创建一个新的界面?

enter image description here

推荐答案

如果您想使用async/await,我认为创建一个名为AsyncVisitor的新接口是有意义的.在某种意义上,您实现的每个访问器都应该被认为是它自己在类型枚举上的"虚"函数.然而,在JavaScript中,FunctionAsyncFunction是两种本质上不同的函数类型,后者可能会暂停执行,并且必须始终返回Promise.因此,让一个访问者接口同时表示常规函数和异步函数是没有意义的.

虽然您可以假设将基于Promise的Visitor实现为只有Visitor<Promise<T>>async/await仍然有效,但是您的接口将混合并将FunctionAsyncFunction视为可互换的类型,如果您正在进行某种元编程,这可能是意想不到的.

换句话说,我认为您的界面应该如下所示:

interface Visitor<T> {
  visitElementA(e: ElementA): T;
  visitElementB(e: ElementB): T;
}

interface AsyncVisitor<T> {
  visitElementAAsync(e: ElementA): Promise<T>;
  visitElementBAsync(e: ElementB): Promise<T>;
}

interface Element {
  accept<T>(v: Visitor<T>): T;
  acceptAsync<T>(v: AsyncVisitor<T>): Promise<T>;
}

Typescript相关问答推荐

React组件数组及其props 的类型定义

等待的R没有用响应对象展开到R

有没有一种方法可以在保持类型的可选状态的同时更改类型?

类型脚本泛型最初推断然后设置

Redux—Toolkit查询仅在不为空的情况下添加参数

使Typescribe强制所有对象具有相同的 struct ,从两个选项

Angular 错误NG0303在Angular 项目中使用app.Component.html中的NGFor

如何按不能保证的功能过滤按键?

对于合并对象中的可选属性(例如选项),类型推断可能是错误的

Angular 15使用react 式表单在数组内部创建动态表单数组

`fetcher.load`是否等同于Get Submit?

在Cypress中,您能找到表格中具有特定文本的第一行吗?

从类型脚本中元组的尾部获取第n个类型

具有匹配功能的TS通用事件处理程序

打字脚本错误:`不扩展[Type]`,而不是直接使用`[Type]`

如何调整项目数组,但允许权重影响顺序

仅当定义了值时才按值筛选数组

从泛型对象数组构造映射类型

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

使用受保护的路由和入门来响应路由