Typescript:是否可以用特定的类型表示Promise解析和拒绝? constmyfunc=(值:布尔):Promise=>{ 返回新承诺((解决、拒绝)=>{ 如果(!值){ 拒绝(新错误(“错误消息”); 返回; } 决心(正确); }); };

Typescript:是否可以用特定的类型表示Promise解析和拒绝? constmyfunc=(值:布尔):Promise=>{ 返回新承诺((解决、拒绝)=>{ 如果(!值){ 拒绝(新错误(“错误消息”); 返回; } 决心(正确); }); };,typescript,promise,typescript-typings,Typescript,Promise,Typescript Typings,在给定的示例中,承诺总是解析为true,并且总是以错误拒绝。但是Promise类型声明没有那么具体。是否可以“告诉”TypeScript,如果承诺解析的值始终是布尔值(或者更好-true),如果拒绝,则该值是错误的一个实例?您不能使用当前类型定义更改错误的类型。错误类型始终为any。从catch的定义来看,这是显而易见的: catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<

在给定的示例中,承诺总是解析为
true
,并且总是以
错误拒绝。但是
Promise
类型声明没有那么具体。是否可以“告诉”TypeScript,如果承诺解析的值始终是布尔值(或者更好-
true
),如果拒绝,则该值是
错误的一个实例?

您不能使用当前类型定义更改错误的类型。错误类型始终为
any
。从
catch
的定义来看,这是显而易见的:

catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
一种解决方法,虽然不是很好,但可以将承诺的结果用于错误和成功案例

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 
        }
    })
constmyfunc=(值:布尔):Promise=>{
返回新承诺((解决、拒绝)=>{
如果(!值){
解决(新错误(“错误消息”);
返回;
}
决心(正确);
});
};
myFunc(真)
.然后(r=>//r true |错误
{
如果(r==真){
r//r是真的
}否则{
r、 消息//r为错误
}
})

错误类型始终为
any
。(因此无法更改传递给catch的参数类型)。您可以返回布尔文本
true
Promis
,感谢您的详细解释。因此,TL;博士的回答是:“不,这是不可能的”。@wube是的,但仅仅回答“不”就好像是一块磁铁吸引了落选者:PIt只是一个总结,不是一个指控。当然,我很感激你的回答:)
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 
        }
    })