嵌套在其他类型中的 Typescript Access 对象
Typescript Access objects nested within other types
我对打字稿比较陌生,它的来龙去脉,我在使用某种结构时遇到了麻烦。它看起来像这样:
我有一个函数可以用来将数据提供给时间轴组件。函数接收到的数据可以是类型 1 或类型 2。现在这就是它变得复杂的地方,类型 1 是一个对象。但是,类型 2 可以是 4 种不同类型中的任意一种
类型 1:{}
类型 2:类型 3 |类型4 |类型5 |类型 6
类型 3-6 在结构上彼此略有不同,不能合并。在下面的函数中,isConversion 标志是对 (object: type6) 的检查。该对象内部有另一个类型为 7 的对象。
type 6: {
...,
type7: {
...,
conversions
}
}
type7 中有一个名为 conversions 的字段,其中包含我需要传递给时间线的数据。
timelineItems = (items: type1 | type2): PropsData => {
const { dataType, isConversion } = this.state
if(isConversion){
const {comments, type7.conversions } = items as type6
return {
comments
type7.conversions
}
}
我有一个解决方法,当我获取数据并将其设置为状态时获取 type7。并使用该值,但我想知道是否有办法获取上述转换对象。
谢谢。
所以您想知道是否可以确定 items
类型是否为 Type6
?
Typescript 类型在编译后丢失,因此您必须编写自己的类型保护,如果对象是 Type6
,它将 return true
。这是纯粹的 javascript 检查,例如,如果您知道只有 Type6
有某个字段,您可以检查它是否存在于该对象中。
interface Type6 {
comments: any[];
type6: Type7;
}
interface Type7 {
conversions: any[];
}
function isType6(obj): obj is Type6 {
return obj.type6 !== undefined;
}
然后你可以像这样使用这个类型保护:
if(isType6(items)) {
const {comments, type6: {conversions}} = items; // no cast needed, ts know it is Type6
return {comments, conversions };
}
我对打字稿比较陌生,它的来龙去脉,我在使用某种结构时遇到了麻烦。它看起来像这样:
我有一个函数可以用来将数据提供给时间轴组件。函数接收到的数据可以是类型 1 或类型 2。现在这就是它变得复杂的地方,类型 1 是一个对象。但是,类型 2 可以是 4 种不同类型中的任意一种
类型 1:{}
类型 2:类型 3 |类型4 |类型5 |类型 6
类型 3-6 在结构上彼此略有不同,不能合并。在下面的函数中,isConversion 标志是对 (object: type6) 的检查。该对象内部有另一个类型为 7 的对象。
type 6: {
...,
type7: {
...,
conversions
}
}
type7 中有一个名为 conversions 的字段,其中包含我需要传递给时间线的数据。
timelineItems = (items: type1 | type2): PropsData => {
const { dataType, isConversion } = this.state
if(isConversion){
const {comments, type7.conversions } = items as type6
return {
comments
type7.conversions
}
}
我有一个解决方法,当我获取数据并将其设置为状态时获取 type7。并使用该值,但我想知道是否有办法获取上述转换对象。
谢谢。
所以您想知道是否可以确定 items
类型是否为 Type6
?
Typescript 类型在编译后丢失,因此您必须编写自己的类型保护,如果对象是 Type6
,它将 return true
。这是纯粹的 javascript 检查,例如,如果您知道只有 Type6
有某个字段,您可以检查它是否存在于该对象中。
interface Type6 {
comments: any[];
type6: Type7;
}
interface Type7 {
conversions: any[];
}
function isType6(obj): obj is Type6 {
return obj.type6 !== undefined;
}
然后你可以像这样使用这个类型保护:
if(isType6(items)) {
const {comments, type6: {conversions}} = items; // no cast needed, ts know it is Type6
return {comments, conversions };
}