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
}
游乐场