typescript Promise构造函数内部赋值时出现类型脚本错误(是否与执行器回调有关?)

ktca8awb  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(119)

下面是我第一次做的一个(希望是最小的)例子:

let resolveIt: CallableFunction;
  const dispatchPromise = new Promise((resolve, reject) => {
    resolveIt = () => {resolve(true)};
  });
  resolveIt();

typescript (也许是正确的)在'resolveIt()'上给了我以下错误;':
Variable 'resolveIt' is used before being assigned.
我的问题是,它 * 真的 * 没有立即定义吗?(在Promise构造函数中?)
我最大的困惑来自于我做了一个测试,看看 * 立即 * 调用它是否会导致它执行 * 第一个 * 初始赋值(空函数() => {}),或者它是否实际上会执行赋值函数,将TEST打印到控制台:

let resolveIt: CallableFunction = () => {};
  const dispatchPromise = new Promise((resolve, reject) => {
    resolveIt = () => {console.log('TEST'); resolve(true)};
  });
  resolveIt();

这里它实际上输出了TEST,所以我对此措手不及,如果我在运行了一段重新赋值函数变量的代码后,根本不能访问初始函数,那么它是否应该是类型安全的,假设它总是被赋值的呢?(调用尽可能接近赋值?)
我的想法(虽然分散)是,这可能是某种"立即调用的异步代码",它似乎是立即的,但也许没有真正的保证,它是?(因此TS警告我这一点?)
我已经看过here的Q/A,它仍然让我想知道 * 为什么 * 会发生这种情况?

kuarbcqp

kuarbcqp1#

正如您从我的问题https://github.com/microsoft/TypeScript/issues/42910中看到的,这是Typescript支持Promise控制流的一个既定弱点。
可以安全地假设该值已被赋值,并且常用的变通方法是to force the issue with a !来指示已知已赋值。
这个问题中的例子读起来像这样,Assert和初始化器的第一行是“原子的”-换句话说,没有什么可以阻止myfun被设置...

let myfun!:() => void;
const myPromise = new Promise((resolve) => {
    myfun = () => {
        doTidyUp();
        resolve;
    }
})

相关问题