Тип отказа от подписки

Как установить тип отказа от моего обещания? Скажем так:

const start = (): Promise<string> => {
   return new Promise((resolve, reject) => {
      if (someCondition) {
         resolve('correct!');
      } else {
         reject(-1);
      }
   });
}

Скажем, я хочу отклонить число. Но я не могу установить тип; Я могу передать, что я хочу на reject здесь.

Более того, при использовании этого обещания, я хочу, чтобы компилировать ошибку, если я неправильно использую тип ответа отклонения.

Ответы

Ответ 1

Как объясняется в этом выпуске, Promise не имеет разных типов для выполнения и отклоненных обещаний. reject принимает any аргументы, которые не влияют на тип обещания.

В настоящее время Promise не может быть напечатано лучше. Это связанно с тем, что обещание может быть отвергнуто throw ИНГАМИ внутри then или catch (это предпочтительный способ отказаться от существующего обещания), и это не может быть обработано путем ввода системы; Кроме того, TypeScript также не имеет типов, специфичных для исключения, за исключением never.

Ответ 2

Исключение типизируется любым, потому что мы не можем гарантировать правильный тип исключения во время разработки, и ни TypeScript, ни JavaScript не обеспечивают возможность защиты типов исключений во время выполнения. Лучший вариант - использовать средства защиты типов для проверки кода во время разработки и во время выполнения.

источник

Ответ 3

То, что @EstusFlask упомянул в его ответе, является правильным.

Но я хочу пойти на шаг ближе к искусственному решению, чтобы имитируйте то, что нам нужно, с возможностями TypeScript.

Иногда я использую этот шаблон в своих кодах😉:

interface IMyEx{
   errorId:number;
}

class MyEx implements IMyEx{
   errorId:number;
   constructor(errorId:number) {
      this.errorId = errorId;
   }
}
// -------------------------------------------------------
var prom = new Promise(function(resolve, reject) {
     try {
         if(..........)
            resolve('Huuuraaa');         
         else
            reject(new MyEx(100));
     }
     catch (error) {
            reject(new MyEx(101));
     }
});

// -------------------------------------------------------
prom()
.then(success => {
    try {
        }
    catch (error) {
        throw new MyEx(102);
    }
})
.catch(reason=>{
    const myEx = reason as IMyEx;
    if (myEx && myEx.errorId) {
       console.log('known error', myEx)
    }else{
       console.log('unknown error', reason)
    }
})