如果这个表达式只在Promise中初始化,为什么它不可调用


let callback1: null | (() => void) = () => {};
let callback2: null | (() => void) = null;
let callback3: null | (() => void) = null;
if (callback1 != null)
callback1(); // callable
callback2 = () => {}
if (callback2 != null)
callback2(); // callable
new Promise<void>(() => callback3 = () => {});
if (callback3 != null)
callback3(); // not callable
// ^^^
// This expression is not callable.
//     Type 'never' has no call signatures.

游乐场

TypeScript似乎在做一些静态分析,但这是错误的,因为代码在JS:中运行良好

let callback3 = null;
new Promise(() => callback3 = () => { console.log("It Works"); });
if (callback3 != null)
callback3();
// output: It Works

由于使用文字null初始化callback3并且不修改它,TS将其类型推断为null

对于if (callback3 != null),您将其缩小到never,因此出现错误。

这种情况不会发生:

declare const maybeCallback: null | (() => void);
callback3 = maybeCallback;
if(callback3 !== null) {
// () => void not never
}

游乐场

最新更新