为何TypeScript中给Promise添加值未触发类型错误?原理询问
为什么这段TypeScript代码没有触发类型错误,且返回的Promise会包含拼接后的字符串?
我写了一段代码,返回的是一个最终会resolve为'horses'的Promise,但我是在处理Promise前直接给它加了字符串。我本来以为会触发类型错误,因为Promise<T>和T类型完全不同,但实际并没有。想搞清楚TypeScript是怎么评估这段代码,以及最终怎么得到带's'的Promise结果的?
async function asyncPluralize(s: Promise<string>): Promise<string> { return (await s) + 's'; } asyncPluralize(Promise.resolve('horse')); // 控制台显示 {fulfilled: 'horses'}
核心逻辑拆解
await的类型解析:参数s是Promise<string>类型,await s会直接提取出Promise内部resolved的string值,所以(await s)的类型就是普通string,和's'做拼接完全合法,结果还是string类型。- async函数的自动包装特性:所有async函数都会自动把返回值包装成Promise。你这里return的是拼接后的
string,TypeScript会自动帮你把它转换成Promise<string>,刚好匹配函数声明的返回类型,所以不会触发任何类型错误。 - 关于控制台的
{fulfilled: 'horses'}:这不是代码返回的实际值,只是运行环境(浏览器/Node)对已完成状态Promise的可视化展示格式。实际返回的是标准Promise对象,当你用.then()或await取值时,得到的就是纯字符串'horses'。
你可以测试这段代码验证:
asyncPluralize(Promise.resolve('horse')).then(res => console.log(res)); // 输出 'horses'
内容的提问来源于stack exchange,提问作者WowBow
相关产品推荐
相关产品推荐

