首页 > 解决方案 > TypeScript 确定类型单击处理程序将返回

问题描述

我有一个自定义按钮控件,其点击处理程序可以返回承诺或无效,如下所示:

// --- Options for button control
export interface buttonOptions {
   aProperty: string
   anotherProperty: number
   onClick: Promise<IButtonClickResult> | void
}

// --- Click handler added for click event inside control class
protected clickHandler(): Promise<IButtonClickResult> | void {
   if(returnsPromise) displaySpinner()

   various operations

   this.options.onClick(this)
}

该控件是使用构建器模式创建的,因此可以这样创建:

buttonClass.build()
  .options({
      aProperty: 'Hope this works',
      anotherProperty: 1,
      onClick: () => {
          return new Promise<IButtonClickResult>((resolve, reject) => {         

            // --- I suppose I could pass reference to resolve or reject to async function and allow that function to resolve or reject the promise
            asyncOperation(resolve, reject)                         
          }).then((result) => button.onClickSuccess(result)).catch((error) => button.onclickError(error))

onClick 也可以分配一个返回 void 的函数:

console.log('I was clicked')

如果单击处理程序返回一个承诺,我想向按钮添加一个微调器,直到承诺解决或拒绝,然后我将通过 .then 或可能通过 .catch 用原始按钮内容替换微调器

我的问题是如何确定是否将在按钮的单击处理程序中返回承诺,以便我知道是否在按钮上显示微调器。

任何帮助是极大的赞赏。我尝试过 typeof 和 instanceof,但无济于事。可能我没有正确使用它们?抱歉,我对 TypeScript 和 NodeJS 还很陌生。

标签: typescriptpromiseonclick

解决方案


由于您正在处理联合类型,您可以简单地测试您离开void分支的方式(假设您已strictNullChecks打开):

const result: Promise<IButtonClickResult> | void = this.onClick(...args);
if (result === undefined) {
  // Nothing returned, don't do the async thing
} else {
  // result is of type Promise here and Typescript will let you call .then, etc.
}

推荐阅读