【问题标题】:Typescript error in Promise.then callbackPromise.then 回调中的打字稿错误
【发布时间】:2021-03-18 16:31:21
【问题描述】:

问题是什么,我该如何解决?

function a(): Promise<void | boolean> {
    let p = Promise.resolve(false);
    return p.then(result => {
        if (result === false) {
            return false;
        }
        return Promise.resolve();
    });
}
/**
Argument of type '(result: boolean) => false | Promise<void>' is not assignable to parameter of type '(value: boolean) => void | PromiseLike<void>'. 
Type 'false | Promise<void>' is not assignable to type 'void | PromiseLike<void>'. 
Type 'boolean' is not assignable to type 'void | PromiseLike<void>'.
*/

TS Playground link

这样写就没有错误

function a(): Promise<void | boolean> {
    let p = Promise.resolve(false);
    return p.then(result => {
        if (result === false) {
            return false;
        }
        return Promise.resolve().then();
    });
}

【问题讨论】:

    标签: typescript promise


    【解决方案1】:

    您的回调必须是async:

    async function a(): Promise<void | boolean> {
        let p = Promise.resolve(false);
        return p.then(async result => { // Added async
            if (result === false) {
                return false;
            }
            return Promise.resolve();
        });
    }
    

    【讨论】:

    • 觉得,这样可以修复错误,但我还是很困惑,如果不返回布尔值,即使没有异步也没有错误,为什么?
    【解决方案2】:

    你可以像这样把你的回调变成async函数。

    return p.then(async
    

    但是您对a() 的定义已经是async 函数。所以根本不需要.then() 构造。

    我会这样重写你的代码:

    async function a(): Promise<void | boolean> {
        const p = Promise.resolve(false);
        const result = await p;
        
        if (result === false) {
            return false;
        }
        
        return Promise.resolve();
    }
    

    【讨论】:

    • 想,如果我不使用async/await,如何解决这个问题?
    【解决方案3】:

    如果你不想使用 async/await,你可以告诉编译器 then 使用什么泛型类型,像这样:

    async function a(): Promise<void | boolean> {
        let p = Promise.resolve(false);
        return p.then<void | boolean>(result => {
            if (result === false) {
                return false;
            }
            return Promise.resolve();
        });
    }
    

    【讨论】:

      【解决方案4】:

      最简单的更改是只返回 undefined 而不是 Promise.resolve() 或按照其他人的建议使用 async/await。

      async function a(): Promise<void | boolean> {
          let p = Promise.resolve(false);
          return p.then(async result => { // Added async
              if (result === false) {
                  return false;
              }
              return; // or return undefined
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-20
        • 1970-01-01
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        相关资源
        最近更新 更多