保证非空值时出现“对象可能为空”错误消息

时间:2018-11-01 23:08:45

标签: typescript

在下面的代码中,类字段$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'方法中的showLoadingMessageshowLoadingMessage是非静态方法,因此如果没有创建ImageFullScreenViewer实例就无法调用它。据我所知,jQuery函数不会返回null,因此可以保证使用非null值进行初始化。

“ TypeScript消息对象在这种情况下可能为'null'是不合理的”结论对吗? (我想在GitHub中创建一个问题,但是他们需要的问题前的TODO列表太麻烦了……)

1 个答案:

答案 0 :(得分:3)

该错误正在按预期工作。正如JB Nizet建议的那样,该错误基于声明的$LoadingMessage类型,即JQuery | null。尽管编译器具有“缩小”功能,该功能将尝试根据最近的分配为变量确定更具体的类型,但缩小在各个函数中均不起作用。

因此,如果您希望代码能够假定$LoadingMessage为非空,则应将类型声明为JQuery并删除= null初始化程序;那么编译器将强制您在构造函数中分配一个非null值。 (当然,在构造函数中的赋值之前有一个简短的窗口,在此期间$LoadingMessage实际上是未定义的,尽管其类型不同;这是TypeScript权衡合理性以易于使用的众多方案之一。)