Typescript 嵌套数组的交集类型

Typescript 嵌套数组的交集类型,typescript,typescript-typings,Typescript,Typescript Typings,尽管对于此类示例,“类型交叉点”可以正常工作: 类型合并=( {lorems:{foo:string}[]}& {lorems:{bar:string}[]} ); 常数x:合并; x、 lorems[0]。foo;//好啊 x、 lorems[0]。条;//好啊 但是没有一种数组方法支持类型交叉,例如: x.lorems.shift().foo;//好啊 x、 lorems.shift().bar;//不存在吗??? 但有了这样一种技巧,它就起作用了: (x.lorems.shift()作

尽管对于此类示例,“类型交叉点”可以正常工作:

类型合并=(
{lorems:{foo:string}[]}&
{lorems:{bar:string}[]}
);
常数x:合并;
x、 lorems[0]。foo;//好啊
x、 lorems[0]。条;//好啊
但是没有一种数组方法支持类型交叉,例如:

x.lorems.shift().foo;//好啊
x、 lorems.shift().bar;//不存在吗???
但有了这样一种技巧,它就起作用了:

(x.lorems.shift()作为x.lorems[0]).bar的类型;

有什么方法可以创建具有嵌套数组交互作用的联合类型吗?

我认为您需要一个联合类型和某种形式的

如果一个对象可以是多个不同类型中的一个,以确保类型安全。TS需要能够以某种方式区分某种类型的东西


interface Type1 { shared: string; lorems: { foo: string }[] };
interface Type2 { shared: string; lorems: { bar: number }[] };
type TypeUnion = Type1 | Type2;

function getLorems(x: TypeUnion) {
  const t = x.lorems.shift();
  x.shared; // This is ok
  if ("foo" in t) t.foo;
  if ("bar" in t) t.bar;
}

我相信你需要一个工会类型和某种形式的工会

如果一个对象可以是多个不同类型中的一个,以确保类型安全。TS需要能够以某种方式区分某种类型的东西


interface Type1 { shared: string; lorems: { foo: string }[] };
interface Type2 { shared: string; lorems: { bar: number }[] };
type TypeUnion = Type1 | Type2;

function getLorems(x: TypeUnion) {
  const t = x.lorems.shift();
  x.shared; // This is ok
  if ("foo" in t) t.foo;
  if ("bar" in t) t.bar;
}

我们可以创建类型util,它将从嵌套数组中提取类型,并创建具有相交类型的新数组

导出类型IntersectionTypeWithArray=(
省略&
省略&{
[输入arrayKeys]:(
(T1[键]扩展数组?U1:从不)和
(T2[键]扩展阵列?U2:从不)
)[]
}
);
稍后,类型交叉点将如下所示:

设x:intersectiontypewitharray;
x、 lorems.shift().bar;//好啊

我们可以创建类型util,它将从嵌套数组中提取类型,并创建具有相交类型的新数组

导出类型IntersectionTypeWithArray=(
省略&
省略&{
[输入arrayKeys]:(
(T1[键]扩展数组?U1:从不)和
(T2[键]扩展阵列?U2:从不)
)[]
}
);
稍后,类型交叉点将如下所示:

设x:intersectiontypewitharray;
x、 lorems.shift().bar;//好啊

尝试仅为foo和bar@captain-yossarian交叉点中的两种类型都是第三方类型,这就是为什么我们不能修改数组类型。尝试只为foo和bar@captain-yossarian交叉口的两种类型都是第三方类型,这就是为什么我们不能修改数组类型。Union在逻辑上是不正确的。因为类型(或对象)始终包含这两个属性。这就是为什么在代码中不需要所有这些条件的原因。@tenbits我不知道用例,所以我猜。但是,如果您期望的对象总是同时具有这两个属性,那么为什么第三方接口会分为两个模型?那是不正确的打字。想想看。如何说对象属性同时是“一件事”和“另一件事”?您正在将两种不同的类型合并在一起,它们看起来不一样。就像说我的
数组
也是一个
字符串
。。。与我的
数组
字符串
相比,这些是数据模型,不是类支持的。我使用多个数据流并将它们合并到单个数据对象中。但不是通过浅层合并,而是通过深度合并。同样值得注意的是,通过typescript中的索引直接访问数组项会保留类型instersection
x.lorems[0].bar正常,但
x.lorems.shift().bar是错误。联合在逻辑上不正确。因为类型(或对象)始终包含这两个属性。这就是为什么在代码中不需要所有这些条件的原因。@tenbits我不知道用例,所以我猜。但是,如果您期望的对象总是同时具有这两个属性,那么为什么第三方接口会分为两个模型?那是不正确的打字。想想看。如何说对象属性同时是“一件事”和“另一件事”?您正在将两种不同的类型合并在一起,它们看起来不一样。就像说我的
数组
也是一个
字符串
。。。与我的
数组
字符串
相比,这些是数据模型,不是类支持的。我使用多个数据流并将它们合并到单个数据对象中。但不是通过浅层合并,而是通过深度合并。同样值得注意的是,通过typescript中的索引直接访问数组项会保留类型instersection
x.lorems[0].bar正常,但
x.lorems.shift().bar是一个错误。