是否可以创建类型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'

TS plaground

Typescript相关问答推荐

如何从具有给定键列表的对象类型的联合中构造类型

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

如何在第一次加载组件时加载ref数组

基于键的值的打字动态类型;种类;

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

带switch 的函数的返回类型的类型缩小

打印脚本中的动态函数重载

诡异的文字类型--S为物语的关键

使用KeyOf和Never的循环引用

Fp-ts使用任务的最佳方法包装选项

正确使用相交类型的打字集

Angular material 无法显示通过API获取的数据

有没有办法取消分发元组的联合?

避免混淆两种不同的ID类型

是否可以通过映射类型将函数参数约束为预定义类型?

将超类型断言为类型脚本中的泛型参数

为什么在这种情况下,打字脚本泛型无法正确自动完成?

来自枚举的<;复选框和组件列表

TypeScript中的这些条件类型映射方法之间有什么区别?

使用受保护的路由和入门来响应路由