TypeScript определяет тип обработчика кликов вернется - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть пользовательский элемент управления Button, обработчик которого может вернуть обещание или аннулирование, как показано ниже:

// --- 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 или, может быть, через occ. 1010 *

Мой вопрос заключается в том, как определить, будет ли возвращено обещание в обработчике нажатия кнопки, чтобы я знал,не отображать счетчик на кнопке.

Любая помощь с благодарностью.Я пытался typeof и instanceof, но безрезультатно.Потенциально я не использовал их правильно?Мои извинения, я новичок в TypeScript и NodeJS.

1 Ответ

2 голосов
/ 25 апреля 2019

Поскольку вы имеете дело с типом объединения, вы можете просто проверить выход из ветви 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...