如何设置拒绝承诺的类型?我们这样说:
const start = (): Promise<string> => {
return new Promise((resolve, reject) => {
if (someCondition) {
resolve('correct!');
} else {
reject(-1);
}
});
}
让我们说我想拒绝一个号码。但我不能设置类型;我可以在reject
传递任何我想要的东西。
此外,在使用此承诺时,如果我错误地使用拒绝响应类型,我希望编译错误。
答案 0 :(得分:10)
正如this issue中所述,Promise
对于履行和拒绝的承诺没有不同的类型。 reject
accepts any
argument不会影响承诺的类型。
目前Promise
无法更好地输入。这是因为throw
then
或catch
内部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提供了在运行时保护异常类型的功能。 最好的选择是使用类型保护在代码中提供设计时和运行时检查。
答案 3 :(得分:2)
答案 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)
}
})