为什么联合分布不会发生在 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
是第二种类型中的裸类型参数,所以会出现分配。
在下面的示例 (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
是第二种类型中的裸类型参数,所以会出现分配。