如果我的 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 端需要异步代码才能使服务器保持响应(一次处理多个请求)。
我正在编写一些通过引用获取资源的 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 端需要异步代码才能使服务器保持响应(一次处理多个请求)。