是否可以创建类型Cartesian
,使得Cartesian<'a' | 'b' | 'c'>
等于类型
'ab' | 'ba' | 'ac' | 'ca' | 'bc' | 'cb'
Partial solution:如果我们定义type Cartesian<T extends string> = `${T}_${T}`;
,我们也会得到'aa'
、'bb'
和'cc'
.有没有办法go 掉这些东西?也许使用Exclude
?
是否可以创建类型Cartesian
,使得Cartesian<'a' | 'b' | 'c'>
等于类型
'ab' | 'ba' | 'ac' | 'ca' | 'bc' | 'cb'
Partial solution:如果我们定义type Cartesian<T extends string> = `${T}_${T}`;
,我们也会得到'aa'
、'bb'
和'cc'
.有没有办法go 掉这些东西?也许使用Exclude
?
创建所需的Cartesian
类型的一种方法是使用条件类型和映射类型来排除不需要的组合.类似于:
type Cartesian<T extends string> = {
[K1 in T]: {
[K2 in T]: K1 extends K2 ? never : `${K1}${K2}`;
}[T];
}[T];
type Result = Cartesian<'a' | 'b' | 'c'>;
// Result: 'ab' | 'ac' | 'ba' | 'bc' | 'ca' | 'cb'