为什么 TS 让我等待一个字符串?

Szc*_*ski 3 typescript

这段代码(使用 promisified fs)有明显错误的括号:

    const jsonSource = await fs.readFile(planFilePath).toString();
Run Code Online (Sandbox Code Playgroud)

意图是:

    const jsonSource = (await fs.readFile(planFilePath)).toString();
Run Code Online (Sandbox Code Playgroud)

问题是:为什么甚至会编译错误的版本?错误的版本将承诺字符串化为"[object Promise]",然后await运算符应用于该字符串。TS 知道对象的toString()方法Promise<string>返回一个字符串。TS 也知道你不能等待一个字符串,只能等待一个承诺。那么为什么要编译呢?

Maa*_*Dev 5

这会编译,因为几乎每个值都可以等待,请尝试在浏览器中运行下面的示例。

(async function() {
  console.log(await Promise.resolve(console.log('')));
  const test = 'testing';
  console.log(await test);
  console.log(await 33);
}());
Run Code Online (Sandbox Code Playgroud)

文档说明了这种行为:

如果该值不是 Promise,它会将值转换为已解决的 Promise,并等待它。

文档:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await