如果我的 TypeScript 方法是异步的(因此被迫 return 一个 Promise),如何将其键入为字符串?

How can my TypeScript method be typed as string if it is async (and thus is forced to return a Promise)?

我正在编写一些通过引用获取资源的 TypeScript classes - 日常事务,例如如果资源是文件,则引用是路径名;如果资源是 Web 服务,则引用是 URL,等等

在这个世界上,引用和资源总是字符串。

所以我有这样的代码:

/**
 * Calls an HTTP endpoint
 */

export default class CallEndpoint {

    getResource(reference: string): string {
        return fetch(reference);
    }

}

我想将getResource定义为string,但是眼尖的读者知道我不能:fetch()是异步的,所以getResource不能定义为 returning 字符串。

我已经 tried to do some research on this question,答案是“正确处理异步,如链接的副本所示”,我觉得这没有回答我的问题,让我陷入了死胡同。

我的编辑器支持 TypeScript,显示上面的代码有错误。如果我这样做,它很高兴:

export default class CallEndpoint {

    async getResource(reference: string) {
        return await fetch(reference);
    }

}

但是,现在 不高兴,因为我希望将其明确标记为 returning 字符串。事实上,我已经编写了一个通用的缓存包装器,我在子 class (CallEndpointCached) 中使用它,我的接口 requires 这个方法到 return 一个字符串(因为,嗯,资源总是一个字符串)。我是否必须将其处理为基本上无类型?

换句话说,有没有一种方法可以阻止此函数,以便我可以获得符合我选择的函数 return 类型的字符串结果?

更新

我想async/await在这里毫无意义,但我的编辑说它仍然无法输入。我觉得应该是:

export default class CallEndpoint {

    getResource(reference: string) {
        return fetch(reference);
    }

}

我想下游可能会有东西等待。

脚注

(我已经多次接触到 Promises 和异步,不幸的是我每次都很难完全理解它们。虽然我知道异步的性能优势,但开发人员生产力的停滞让我感到震惊的不仅仅是削弱这些好处,尤其是在系统不需要优化的情况下)。

async 方法总是 return 承诺。任何 return 都包含在 Promise<T> 中。因此,如果您有一个 return 类型为 string 的值的方法,那么该方法的 return 值为 Promise<string>.

especially where the system is not in need of optimisation

async 并不意味着“更快”。这意味着“响应”。 UI 端需要异步代码以使浏览器 window 保持响应(避免“冻结选项卡”对话框),Node.js 端需要异步代码才能使服务器保持响应(一次处理多个请求)。