Typescript 是否从具有元组的并集中排除“unknown[]”?

Typescript 是否从具有元组的并集中排除“unknown[]”?,typescript,Typescript,我认为这是不可能的,但在提出github问题之前,我想在这里问一下 我有这样一种类型: type X=[string,number]|未知[] 我想提取[string,number]部分。这可能吗?这不起作用: Y型=排除 在上述情况下,Y是never。我理解为什么,因为[string,number]扩展了unknown[],所以通过排除它,工会双方都被“拒绝”。但是有没有聪明的条件类型可以用来摆脱unknown[] 注意:我不是自己定义X,我试图编写一个函数签名,其中一个中间类型看起来像[

我认为这是不可能的,但在提出github问题之前,我想在这里问一下

我有这样一种类型:

type X=[string,number]|未知[]
我想提取
[string,number]
部分。这可能吗?这不起作用:

Y型=排除
在上述情况下,
Y
never
。我理解为什么,因为
[string,number]
扩展了
unknown[]
,所以通过排除它,工会双方都被“拒绝”。但是有没有聪明的条件类型可以用来摆脱
unknown[]

注意:我不是自己定义
X
,我试图编写一个函数签名,其中一个中间类型看起来像
[string,number]| unknown[]
。所以我不能直接使用
[string,number]

中的示例

在十字路口,一切都是未知的

我们可以创建与实际类型毫无共同之处的类型,例如:

type Noop = { __noop: '__noop' };
然后在条件类型中,我们可以检查数组项的交集是否扩展了伪类型,如果是,则排除它(因为我们知道它必须是
unknown
):

type ExcludeUnknown=T扩展数组
? Noop扩展(I&Noop)?从不:T
:T;
类型Y=ExcludeUnknown;//[字符串,数字]


**请注意,对于包含
{}
对象
未知
(例如
[string,number,{}]
)的元组,这不起作用

type ExcludeUnknown<T> = T extends Array<infer I>
  ? Noop extends (I & Noop) ? never : T
  : T;

type Y = ExcludeUnknown<X>; // [string, number]