Typescript 如何基于回调指定返回类型';什么是退货类型?

Typescript 如何基于回调指定返回类型';什么是退货类型?,typescript,promise,Typescript,Promise,下面的接口定义了一个函数,该函数接受回调函数并返回回调函数返回的值 导出接口监视器复制操作{ (operationName:string,operation:()=>T | Promise):T | Promise; } 问题是,如果在回调总是返回其中一种类型的上下文中使用此函数,TypeScript仍然认为外部函数可以返回任何一种类型 例如,如果我编写以下代码 public addNumbersAsync(n1:number,n2:number,n3:number,n4:number):承诺

下面的接口定义了一个函数,该函数接受回调函数并返回回调函数返回的值

导出接口监视器复制操作{
(operationName:string,operation:()=>T | Promise):T | Promise;
}
问题是,如果在回调总是返回其中一种类型的上下文中使用此函数,TypeScript仍然认为外部函数可以返回任何一种类型

例如,如果我编写以下代码

public addNumbersAsync(n1:number,n2:number,n3:number,n4:number):承诺{
返回此.monitoredOperation(“addNumbers”,()=>Promise.resolve(n1+n2+n3+n4));
}
TypeScript抱怨无法将
number | Promise
分配给
Promise

我见过一些例子,其中使用
infere
捕获函数的返回值,但我不确定如何在这里应用它

我怎样才能告诉TypeScript我这里的信息和返回类型必须匹配

编辑:


我需要这两种可能的类型,因为我的接口实现需要区分它们。如果我的接口只使用
T
,我会得到一个
类型的错误,类型“Promise”不可分配给类型“T”
。以下是一个简化版本:

function monitoredOperation(operationName:string,operation:()=>T | Promise):T | Promise{
让onSuccess=(值:T):T=>{
广播(“完成”);
返回值;
}
let onFailure=(错误:any):从不=>{
广播(“失败”);
投掷误差;
}
试一试{
让结果=运算();
如果(建议(结果)){
返回结果。然后(onSuccess,onFailure);
}否则{
成功返回(结果);
}
}
捕获(e){
失败(e);
}
}

我不确定这一承诺能带来什么好处。如果没有类型透视图,函数的行为实际上是正确的
monitoredOperation
返回回调返回的内容,无论是什么,
Promise
还是其他内容:

interface MonitoredOperation {
  <T = any>(operationName: string, operation: () => T): T;
}

class X {
  private monitoredOperation!: MonitoredOperation
  public addNumbersAsync(n1: number, n2: number, n3: number, n4: number): Promise<number> {
    return this.monitoredOperation("addNumbers", () => Promise.resolve(n1 + n2 + n3 + n4));
  }
}


我不确定通过
|承诺
获得了什么。如果没有类型透视图,函数的行为实际上是正确的
monitoredOperation
返回回调返回的内容,无论是什么,
Promise
还是其他内容:

interface MonitoredOperation {
  <T = any>(operationName: string, operation: () => T): T;
}

class X {
  private monitoredOperation!: MonitoredOperation
  public addNumbersAsync(n1: number, n2: number, n3: number, n4: number): Promise<number> {
    return this.monitoredOperation("addNumbers", () => Promise.resolve(n1 + n2 + n3 + n4));
  }
}


增加了什么价值(即类型安全)
| Promise
。这同样有效:增加了什么价值(即类型安全)
| Promise
。这同样有效:我需要这两种可能的类型,因为我的接口实现需要区分它们。因此,您的第二个解决方案运行良好。谢谢。@MichaelBest如果这只是一个实现细节,为什么不使用单独的实现签名:我需要这两种可能的类型,因为我的接口实现需要区分它们。因此,您的第二个解决方案运行良好。谢谢。@MichaelBest如果只是一个实现细节,为什么不使用单独的实现签名: