为什么联合分布不会发生在 T[number] 中,其中 T 是一个 ArrayLike?

Why doesn't union distribution happen with T[number] where T is an ArrayLike?

在下面的示例 (playground link) 中,我希望 Foo<[0, 1]>Bar<[0, 1]> 都解析为 0[] | 1[],因为条件类型中的联合分布。但是,Foo<[0, 1]> 实际上是 (0 | 1)[],编译器声称第一个 @ts-expect-error 指令未被使用。

type Foo<T extends ArrayLike<unknown>> = T[number] extends infer Elem
  ? Elem[]
  : never;
type Bar<T extends ArrayLike<unknown>> = T[number] extends infer Elem
  ? Elem extends infer U
    ? U[]
    : never
  : never;

// @ts-expect-error
const foo: Foo<[0, 1]> = [0, 1];
// @ts-expect-error
const bar: Bar<[0, 1]> = [0, 1];

我查阅了文档,发现 the following statement;

When conditional types act on a generic type, they become distributive when given a union type. (emphasis on "a generic type" mine)

我能想到的唯一原因是 Elem 是示例中的通用类型,但 T[number] 本身不是。我怀疑这会导致条件类型无法分配 T[number],但我不确定我的猜测是否正确。有人可以解释这种行为吗?

分布仅发生在裸类型参数上,这意味着没有应用任何其他类型操作的单一类型参数。

T[number] 不是裸类型参数,所以没有分配。 Elem是第二种类型中的裸类型参数,所以会出现分配。