打字稿承诺拒绝类型

时间:2018-04-27 22:38:52

标签: javascript typescript promise

如何设置拒绝承诺的类型?我们这样说:

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

让我们说我想拒绝一个号码。但我不能设置类型;我可以在reject传递任何我想要的东西。

此外,在使用此承诺时,如果我错误地使用拒绝响应类型,我希望编译错误。

5 个答案:

答案 0 :(得分:10)

正如this issue中所述,Promise对于履行和拒绝的承诺没有不同的类型。 reject accepts any argument不会影响承诺的类型。

目前Promise无法更好地输入。这是因为throw thencatch内部let datePicker = UIDatePicker() datePicker.datePickerMode = UIDatePickerMode.time datePicker.minuteInterval = 15 拒绝承诺(这是拒绝现有承诺的首选方式),这不能通过键入系统来处理;另外,TypeScript also doesn't have exception-specific types except never

答案 1 :(得分:4)

由于在某些情况下(例如Promise或异常抛出)无法设置错误类型,因此我们可以处理类似锈蚀样式的错误:

// Result<T, E> is the type used for returning and propagating errors.
// It is an sum type with the variants,
// Ok<T>, representing success and containing a value, and 
// Err<E>, representing error and containing an error value.
export type Ok<T> = { _tag: "Ok"; ok: T };
export type Err<E> = { _tag: "Err"; err: E };
export type Result<T, E> = Ok<T> | Err<E>;
export const Result = Object.freeze({
  Ok: <T, E>(ok: T): Result<T, E> => ({ _tag: "Ok", ok }),
  Err: <T, E>(err: E): Result<T, E> => ({ _tag: "Err", err }),
});

const start = (): Promise<Result<string, number>> => {
  return new Promise((resolve) => {
    resolve(someCondition ? Result.Ok("correct!") : Result.Err(-1));
  });
};

start().then((r) => {
  switch (r._tag) {
    case "Ok": {
      console.log(`Ok { ${r.ok} }`);
      break;
    }
    case "Err": {
      console.log(`Err { ${r.err} }`);
      break;
    }
  }
});

答案 2 :(得分:2)

  

该异常的类型为any,因为我们不能保证正确的类型   设计时异常的类型,TypeScript和   JavaScript提供了在运行时保护异常类型的功能。   最好的选择是使用类型保护在代码中提供设计时和运行时检查。

source

答案 3 :(得分:2)

您现在可以使用PromiseRejectionEvent键入此内容(当然,在IE中除外):

MDN Documentation

Microsoft Documentation

答案 4 :(得分:1)

his answer中提到的@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)
    }
})