【发布时间】:2019-11-08 18:31:07
【问题描述】:
参见下面的代码 sn-p:
interface MyObj {
myOptionalProp: MyOptionalPropObj; // NOT OPTIONAL
}
interface MyOptionalPropObj {
myProp1: SomeType;
myProp2?: SomeType;
}
type Test1 = MyObj['myOptionalProp']['myProp1']; // Works
type Test2 = MyObj['myOptionalProp']['myProp2']; // Works
如果myOptionalProp 不是可选的,则访问MyObj 中要分配给Test1 和Test2 的嵌套属性可以正常工作。
但是。一旦myOptionalProp 是可选的:
interface MyObj {
myOptionalProp?: MyOptionalPropObj; // OPTIONAL
}
interface MyOptionalPropObj {
myProp1: SomeType;
myProp2?: SomeType;
}
type Test1 = MyObj['myOptionalProp']['myProp1']; // Doesn't work
type Test2 = MyObj['myOptionalProp']['myProp2']; // Doesn't work
TypeScript 抛出此错误:
Property 'myProp1' does not exist on type 'MyOptionalPropObj | undefined'.ts(2339)
有没有办法在访问类型时进行断言?类似于
myObj.myOptionalProp!.myProp1
但是对于types?
此示例中的 MyObj 类型是在我们的情况下自动生成的,特别是 GraphQL 代码生成器,我们无法控制它的结构。我们本可以直接使用 SomeType 类型,但目前这不是一个选项。
自动生成的类型示例是:
export type TestQuery = (
{ __typename?: 'Query' }
& { profile: Maybe<(
{ __typename?: 'Profile' }
& Pick<Profile, 'id' | 'name' | 'updatedAt' | 'createdAt'>
& { owner: Maybe<(
{ __typename?: 'User' }
& Pick<User, 'id' | 'displayName'>
)>, users: Maybe<Array<(
{ __typename?: 'User' }
& Pick<User, 'id' | 'displayName'>
)>> }
)> }
);
在此示例中,我们无法访问 profile 的 owner 属性,因为所有者可以是未定义的。
TestQuery['profile']['owner'] // Doesn't work
【问题讨论】:
标签: typescript