我不太确定这里发生了什么,但是我无法访问似乎是从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
属性的所有组合,但是没有任何效果。我以为我会尝试进入界面并使用as
或instanceof
,但是我似乎也无法以任何方式导入界面。...
如何在这里使编译器满意?
编辑:添加了另一行使类型检查更加精确
答案 0 :(得分:2)
尽管if (renameResults) {
检查真假,但不会缩小您特定的联合类型。 将缩小... | null
的并集以删除null
。
您将需要编写自定义类型防护以缩小联合类型。
例如:
function isRenameSuccess(obj: RenameInfoSuccess | RenameInfoFailure) : obj is RenameInfoSuccess {
return obj.canRename;
}
按如下方式使用时,会将类型缩小到RenameInfoSuccess
中的if
和RenameInfoFailure
中的else
:
if (isRenameSuccess(renameResults)) {
// renameResults: RenameInfoSuccess
} else {
// renameResults: RenameInfoFailure
}
您也可以将整个猪笼统地把这两种类型转换成Discriminated Union类型,这几乎是这样。