在下面的代码中,类字段$LoadingMessage
可为空,但是它将在构造函数中初始化。
export default class ImageFullScreenViewer {
private static readonly LOADING_MESSAGE_CSS_SELECTOR_BY_ID: string = '#ImageFullScreenViewer-LoadingMessage';
private $LoadingMessage: JQuery | null = null;
constructor (thumbnailsContainerSelectors: string | Array<string>, adaptedPageLayoutManager: AdaptedPageLayoutManager) {
this.$LoadingMessage = $(ImageFullScreenViewer.LOADING_MESSAGE_CSS_SELECTOR_BY_ID);
}
showLoadingMessage() {
this.$LoadingMessage.show(); // Object is possibly 'null'.
}
}
在严格模式下,TypeScript告诉我Object is possibly 'null'
方法中的showLoadingMessage
。 showLoadingMessage
是非静态方法,因此如果没有创建ImageFullScreenViewer
实例就无法调用它。据我所知,jQuery函数不会返回null,因此可以保证使用非null值进行初始化。
“ TypeScript消息对象在这种情况下可能为'null'是不合理的”结论对吗? (我想在GitHub中创建一个问题,但是他们需要的问题前的TODO列表太麻烦了……)
答案 0 :(得分:3)
该错误正在按预期工作。正如JB Nizet建议的那样,该错误基于声明的$LoadingMessage
类型,即JQuery | null
。尽管编译器具有“缩小”功能,该功能将尝试根据最近的分配为变量确定更具体的类型,但缩小在各个函数中均不起作用。
因此,如果您希望代码能够假定$LoadingMessage
为非空,则应将类型声明为JQuery
并删除= null
初始化程序;那么编译器将强制您在构造函数中分配一个非null值。 (当然,在构造函数中的赋值之前有一个简短的窗口,在此期间$LoadingMessage
实际上是未定义的,尽管其类型不同;这是TypeScript权衡合理性以易于使用的众多方案之一。)