【问题标题】:"Object is possibly 'null'" error message when non-null value guaranteed保证非空值时的“对象可能为‘空’”错误消息
【发布时间】:2018-11-01 23:08:45
【问题描述】:

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

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

【问题讨论】:

  • $LoadingMessage 是可以为空的对象,而不是this
  • 为什么用JQuery | null这个类型来表示一个不可为空的值?
  • @JBNizet,好吧,因为我不知道其他方式。请教我。
  • @Silvermind,我想感谢@types/jquery

标签: typescript


【解决方案1】:

错误按预期工作。正如 JB Nizet 所建议的,错误基于 $LoadingMessage 的声明类型,即 JQuery | null。虽然编译器具有“缩小”功能,可以尝试根据最近的分配确定变量的更具体的类型,但缩小不适用于函数。

因此,如果您希望代码能够假定 $LoadingMessage 为非 null,则应将类型声明为 JQuery 并删除 = null 初始值设定项;然后编译器将强制您在构造函数中分配一个非空值。 (当然,在构造函数中赋值之前有一个简短的窗口,在此期间 $LoadingMessage 实际上是未定义的,尽管它的类型;这是 TypeScript 牺牲可靠性以方便使用的众多场景之一。)

【讨论】:

  • 感谢您的回答。我明白了,类型检查引擎无法识别$LoadingMessage 是否是类字段,可以吗?如果我将类型声明为JQuery,而JQuery 将找不到元素#ImageFullScreenViewer-LoadingMessage,则将返回空的JQuery 对象,不会出现element not found 之类的错误。调试过程中可能需要很长时间...
  • 我完全不明白你的第一个问题。如果 jQuery 没有找到 #ImageFullScreenViewer-LoadingMessage 元素,它将返回一个空(但非 null)的 jQuery 对象,而不管您为 $LoadingMessage 声明的类型如何,因此需要检查这种情况以避免困难的调试是不相关的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多