Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript “如何访问”;“类型”;可选属性的属性?_Typescript - Fatal编程技术网

Typescript “如何访问”;“类型”;可选属性的属性?

Typescript “如何访问”;“类型”;可选属性的属性?,typescript,Typescript,请参阅下面的代码片段: 接口MyObj{ myOptionalProp:MyOptionalPropObj;//非可选 } 界面肌视神经本体{ myProp1:某种类型; myProp2?:某种类型; } 类型Test1=MyObj['myOptionalProp']['myProp1'];//作品 类型Test2=MyObj['myOptionalProp']['myProp2'];//作品 如果myoptionprop不是可选的,则访问MyObj中要分配给Test1和Test2的嵌套属性

请参阅下面的代码片段:

接口MyObj{
myOptionalProp:MyOptionalPropObj;//非可选
} 
界面肌视神经本体{
myProp1:某种类型;
myProp2?:某种类型;
}
类型Test1=MyObj['myOptionalProp']['myProp1'];//作品
类型Test2=MyObj['myOptionalProp']['myProp2'];//作品
如果
myoptionprop
不是可选的,则访问
MyObj
中要分配给
Test1
Test2
的嵌套属性可以正常工作

不过。一旦myOptionalProp是可选的:

接口MyObj{
myOptionalProp?:MyOptionalPropObj;//可选
} 
界面肌视神经本体{
myProp1:某种类型;
myProp2?:某种类型;
}
类型Test1=MyObj['myOptionalProp']['myProp1'];//不起作用
类型Test2=MyObj['myOptionalProp']['myProp2'];//不起作用
TypeScript引发以下错误:

Property 'myProp1' does not exist on type 'MyOptionalPropObj | undefined'.ts(2339)
在访问类型时是否有一种断言方法?类似于

myObj.myOptionalProp!.myProp1
但是对于
类型
s


本例中的
MyObj
类型在我们的情况下是自动生成的,特别是GraphQL代码生成器,我们无法控制它的结构。我们可以直接使用类型
SomeType
,但目前这不是一个选项

自动生成的类型示例如下:

导出类型TestQuery=(
{{uuuu typename?:'Query'}
&{简介:也许}
);
在本例中,我们无法访问
profile
owner
属性,因为owner可以是未定义的

TestQuery['profile']['owner'] // Doesn't work

如果属性是可选的,则其类型为未定义的并集,并且由于只有并集的公共属性可访问,因此原始类型的所有属性都将不可访问

您需要从联合中删除
未定义的
。预定义的条件类型
Exclude
将实现以下功能:

interface MyObj {
    myOptionalProp?: MyOptionalPropObj; // OPTIONAL
}

interface MyOptionalPropObj {
    myProp1: string;
    myProp2?: number;
}

type Test1 = Exclude<MyObj['myOptionalProp'], undefined>['myProp1']; //ok
type Test2 = Exclude<MyObj['myOptionalProp'], undefined>['myProp2'];  // ok
接口MyObj{
myOptionalProp?:MyOptionalPropObj;//可选
}
界面肌视神经本体{
myProp1:字符串;
myProp2?:编号;
}
类型Test1=Exclude['myProp1']//好啊
类型Test2=Exclude['myProp2'];//好啊

如果我们开始进一步挖掘,这看起来会很难看,但确实有效。是否有替代方法?创建一些
DeepRequired
类型,以从所有属性中删除
null
undefined
?创建一些助手
类型KeyOf=Exclude[K]
?我想有几种方法可以简化它……谢谢!这就是我们要找的。现在就行了。