如果您想使用async/await
,我认为创建一个名为AsyncVisitor
的新接口是有意义的.在某种意义上,您实现的每个访问器都应该被认为是它自己在类型枚举上的"虚"函数.然而,在JavaScript中,Function
和AsyncFunction
是两种本质上不同的函数类型,后者可能会暂停执行,并且必须始终返回Promise
.因此,让一个访问者接口同时表示常规函数和异步函数是没有意义的.
虽然您可以假设将基于Promise的Visitor实现为只有Visitor<Promise<T>>
和async/await
仍然有效,但是您的接口将混合并将Function
和AsyncFunction
视为可互换的类型,如果您正在进行某种元编程,这可能是意想不到的.
换句话说,我认为您的界面应该如下所示:
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>;
}