Javascript Typescript承诺拒绝类型
我如何设定拒绝承诺的类型?让我们假设我这样做:Javascript Typescript承诺拒绝类型,javascript,typescript,promise,Javascript,Typescript,Promise,我如何设定拒绝承诺的类型?让我们假设我这样做: const start = (): Promise<string> => { return new Promise((resolve, reject) => { if (someCondition) { resolve('correct!'); } else { reject(-1); } }); } const start=():Prom
const start = (): Promise<string> => {
return new Promise((resolve, reject) => {
if (someCondition) {
resolve('correct!');
} else {
reject(-1);
}
});
}
const start=():Promise=>{
返回新承诺((解决、拒绝)=>{
如果(某些条件){
决心(‘正确’);
}否则{
拒绝(-1);
}
});
}
假设我想用一个数字来拒绝。但是我不能设置类型;我可以将我想要的任何内容传递到此处的拒绝
此外,在使用此承诺时,如果我错误地使用拒绝响应类型,我希望出现编译错误。如中所述,承诺
对于已履行承诺和已拒绝承诺没有不同的类型<不影响承诺类型的代码>拒绝
目前无法键入更好的Promise
。这是由于这样一个事实,即可以通过抛出然后或捕获来拒绝承诺(这是拒绝现有承诺的更好方法),而这不能通过键入系统来处理;也
由于我们无法保证输入的异常是正确的,因此键入的异常为any
设计时异常的类型,并且既不是TypeScript也不是
JavaScript提供了在运行时保护异常类型的能力。
最好的选择是使用类型保护在代码中同时提供设计时和运行时检查。
中提到的@EstusFlask是正确的
但是我想更接近一个人工解决方案来
使用TypeScript
功能模拟我们想要的内容
有时我在我的代码中使用此模式因为在某些情况下无法设置错误类型,如承诺或异常抛出,我们可以以类似生锈的方式处理错误:
//Result是用于返回和传播错误的类型。
//它是一种带有变量的求和类型,
//好的,表示成功并包含一个值,以及
//Err,表示错误并包含错误值。
导出类型Ok={u标记:“Ok”;Ok:T};
导出类型Err={u标记:“Err”;Err:E};
导出类型结果=正常|错误;
导出常量结果=Object.freeze({
Ok:(Ok:T):结果=>({U标记:“Ok”,Ok}),
Err:(Err:E):结果=>({u标记:“Err”,Err}),
});
const start=():Promise=>{
返回新承诺((解决)=>{
解析(someCondition?Result.Ok(“correct!”):Result.Err(-1));
});
};
开始()。然后((r)=>{
开关(r.\U标签){
案例“Ok”:{
log(`Ok{${r.Ok}}`);
打破
}
案例“Err”:{
log(`Err{${r.Err}}`);
打破
}
}
});
您现在可以使用PromisejectionEvent
键入以下内容(当然,IE除外):
可能会引起兴趣。请注意,这与捕获的错误类型一致。我建议不要使用此模式。问题是,现在有两种错误处理方法,一种是检查结果的错误类型,另一种是使用.catch
。当然,您可以在整个代码库中假设只会使用错误结果,但我向您保证,这种假设将使您在任何规模较大的项目中付出代价。实际上,这是函数式编程的模式,称为“二者皆有”,其后果我知道,但这丝毫不会改变我所说的。假设是问题的原因。另外,虽然Result
可能是真和类型,但Promise不是monad,所以您实际上不在FP区。我已经在这条路上走了太多次了,不仅仅是打字。老实说,我应该有点宽容,因为在有人用TypeScript为异步编程创建一个真正的一元双触发器之前,每次我看到单词Promise
,我都会感到畏缩。如果上帝再给我一点时间,我就会是那个家伙。嘿@LodewijkBogaards,我很想看看你对我构建的异步结果库有什么想法:。我认为您对上述模式处理错误的冲突方式提出了很大的争议,因此我选择抽象出一个新实体背后的“异步性”组件——AsyncResult,它恰好在下面使用了一个承诺,但外部世界不必知道这一点。@GabrielC.Troia haha!我最近找到了你的图书馆,并把它展示给我们的前端技术负责人,告诉他:这就是应该做的:)如果你碰巧在找工作:欢迎你随时到StackState工作!我认为这里的目标是能够键入像承诺
这样的承诺,而您提供的示例没有实现这一点。“我如何设置拒绝我承诺的类型?”