TypeScript определит тип, который вернет обработчик щелчков

#typescript #promise #onclick

#typescript #обещание #onclick

Вопрос:

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

 // --- 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)
}
  

Элемент управления создается с использованием шаблона builder, поэтому он будет создан как таковой:

 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')
  

Если обработчик щелчка вернет обещание, я хочу добавить счетчик к кнопке до тех пор, пока обещание не разрешится или не будет отклонено, тогда я заменю счетчик исходным содержимым кнопки через .затем или, может быть, через oops .catch

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

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

Комментарии:

1. Я немного сбит с толку. Что someOperation возвращает? Обещание или что-то еще? Также onClick метод в том виде, в каком он написан, может возвращать только void прямо сейчас. При каких обстоятельствах он должен возвращать Promise вместо этого? Наконец, можете ли вы показать нам, что вы пытались использовать instanceof ? Может помочь нам получить лучшее представление о том, чего вы пытаетесь достичь в этом примере.

2. Извините за путаницу. Я сам был в замешательстве. Совсем недавно, несколько дней назад, начал работать с обещаниями. Я обновлю вопрос в попытке прояснить

Ответ №1:

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

Комментарии:

1. Большое вам спасибо, это имеет смысл. Это совершенно новый мир, в который я вступаю. Были некоторые проблемы с ростом, но мне это нравится.