打字稿:无法访问命名空间接口

时间:2018-12-20 13:43:12

标签: typescript

我不太确定这里发生了什么,但是我无法访问似乎是从TSServer协议(https://github.com/Microsoft/TypeScript/blob/master/src/server/protocol.ts)导出的接口

要退后一步,我正在一个项目中,代码可以做到这一点...

if (renameResults) {
  if (renameResults.info.canRename) {
    // do stuff ... no errors
  }
} else {
  this.printErr(renameResults.info.localizedErrorMessage);
}

如果查看TSServer协议的类型,则会发现这是RenameInfoSuccess | RenameInfoFailure here的联合类型

上面的代码给我错误Property 'localizedErrorMessage' does not exist on type 'RenameInfo'. Property 'localizedErrorMessage' does not exist on type 'RenameInfoSuccess'

但不能为RenameInfoSuccess,因为我已经检查过它是否为假,对吗?我已经尝试过检查info属性的所有组合,但是没有任何效果。我以为我会尝试进入界面并使用asinstanceof,但是我似乎也无法以任何方式导入界面。...

如何在这里使编译器满意?

编辑:添加了另一行使类型检查更加精确

1 个答案:

答案 0 :(得分:2)

尽管if (renameResults) {检查真假,但不会缩小您特定的联合类型。 缩小... | null的并集以删除null

您将需要编写自定义类型防护以缩小联合类型。

例如:

function isRenameSuccess(obj: RenameInfoSuccess | RenameInfoFailure) : obj is RenameInfoSuccess {
    return obj.canRename;
}

按如下方式使用时,会将类型缩小到RenameInfoSuccess中的ifRenameInfoFailure中的else

if (isRenameSuccess(renameResults)) {
    // renameResults: RenameInfoSuccess
} else {
    // renameResults: RenameInfoFailure
}

您也可以将整个猪笼统地把这两种类型转换成Discriminated Union类型,这几乎是这样。