无效类型和未命名类型的联合类型的访问属性

时间:2018-10-31 15:17:44

标签: typescript graphql apollo

我正在使用GraphQL,目前在我的代码中,我有一个GraphQLError对象,该对象具有名为extensions的属性,其类型为void | { [key: string]: any; }。这样做是为了,如果我尝试访问extensions的任何属性,都会收到此错误:

x.extensions.code === 'UNAUTHENTICATED'


Property 'code' does not exist on type 'void | { [key: string]: any; }'.
  Property 'code' does not exist on type 'void'.

访问联合类型中两种类型都不存在的属性的建议解决方案是:https://github.com/Microsoft/TypeScript/issues/12815#issuecomment-266193707

let pet = getSmallPet();

if ((<Fish>pet).swim) {
    (<Fish>pet).swim();
}
else {
    (<Bird>pet).fly();
}

但是,如果没有类型名称,我将无法进行类型断言。

关于如何解决此问题的任何想法?

关于, 理查德

1 个答案:

答案 0 :(得分:0)

您可以使用类型防护来缩小并集的类型:

declare let o: {
    extensions: void | { [key: string]: any; }
}

o.extensions["test"] // error
if (o.extensions) {
    o.extensions["test"] // ok here
}

注意,仅当您打开strictNullChecks时,您的代码才会引发错误