首页 > 解决方案 > TypeScript:联合类型分布的条件类型数组

问题描述

我有一个使用泛型类型T来确定类型的条件Array<T>类型。作为一个人为的例子:

type X<T> = T extends string ? Array<T> : never;

我遇到的问题是,当我提供联合类型时,它被分发为 2 种数组类型的联合,而不是我的联合类型的数组。

// compiler complains because it expects Array<'one'> | Array<'two'>
const y: X<'one' | 'two'> = ['one', 'two'];

有没有办法输入这样我的条件类型产生一个 Array<'one' | '二'> 条件是否满足?

标签: typescriptdiscriminated-union

解决方案


您遇到了条件类型的分布行为,其中条件类型分布在包含联合的裸类型参数上。这种行为在某些情况下非常有用,但起初可能有点令人惊讶。

禁用此行为的 simples 选项是将 type 参数放在一个元组中:

type X<T> = [T] extends [string] ? Array<T> : never;

// ok y is Array<'one' | 'two'>
const y: X<'one' | 'two'> = ['one', 'two'];

您可以在此处此处阅读有关此行为的更多信息


推荐阅读