Машинопись: возможно ли указать, что Promise разрешает и отклоняет с определенным типом? - PullRequest
0 голосов
/ 12 октября 2018
const myFunc = (value: boolean): Promise<boolean | Error> => {
  return new Promise((resolve, reject) => {
    if (!value) {
      reject(new Error("error msg"));
      return;
    }

    resolve(true);
  });
};

В данном примере Обещание всегда разрешается до true и всегда отклоняется с Error.Но объявление типа Promise<boolean | Error> не настолько специфично.Можно ли «сказать» TypeScript, что если Promise разрешает, значение всегда является логическим (или даже лучше - true), а если оно отклоняет значение, это экземпляр Error?

1 Ответ

0 голосов
/ 12 октября 2018

Вы не можете изменить тип ошибки с текущим определением типа.Тип ошибки всегда any.Это очевидно, если взглянуть на определение catch:

catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;

Аргумент reason обратного вызова onrejected равен any.

. Вы можете использовать логический тип литерала.true для представления того факта, что значение может быть только истинным

const myFunc = (value: boolean): Promise<true> => {
    return new Promise((resolve, reject) => {
      if (!value) {
        reject(new Error("error msg"));
        return;
      }
      resolve(true);
    });
  };

myFunc(true)
    .then(r=> r) // r is typed as true

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

const myFunc = (value: boolean): Promise<true | Error> => {
    return new Promise((resolve, reject) => {
        if (!value) {
            resolve(new Error("error msg"));
            return;
        }
        resolve(true);
    });
};

myFunc(true)
    .then(r =>  // r true | Error
    {
        if(r === true){
            r // r is true 
        }else{
            r.message // r is Error 
        }
    })
...