我有几个需要与相同类型参数一起使用的泛型类型:

type Type1<A, B, C> = ...;
type Type2<A, B, C> = ...;
type Type3<A, B, C> = ...;

f(x: Type1<ComplexParam1, ComplexParam2, ComplexParam3>) {
  const y: Type2<ComplexParam1, ComplexParam2, ComplexParam3> = ...;
  const z: Type3<ComplexParam1, ComplexParam2, ComplexParam3> = ...;
}

如果我可以对类型参数使用扩散运算符,我就可以避免重复:

type ComplexParams = [ComplexParam1, ComplexParam2, ComplexParam3];

f(x: Type1<...ComplexParams>) {
  const y: Type2<...ComplexParams> = ...;
  const z: Type3<...ComplexParams> = ...;
}

但这种语法不起作用.有没有其他方法来实现类似的目标?

推荐答案

我认为最接近这一点的方法是使用Tuple typesIndex Access types,如下所示.这可能会节省一些代码,因为您只需定义ComplexParams一次.

type Type1<A, B, C> = any;
type Type2<A, B, C> = any;
type Type3<A, B, C> = any;

type ComplexParam1 = any;
type ComplexParam2 = any;
type ComplexParam3 = any;

type ComplexParams = [ComplexParam1, ComplexParam2, ComplexParam3];

function f(x: Type1<ComplexParams[0], ComplexParams[1], ComplexParams[2]>) {
  let y: Type2<ComplexParams[0], ComplexParams[1], ComplexParams[2]>;
  let z: Type3<ComplexParams[0], ComplexParams[1], ComplexParams[2]>;
}

或者重构Type1Type2Type3以接受单个元组参数,而不是三个单独的generic arguments(稍后访问它的各个类型->;相同的原则).

TypeScript Playground

Typescript相关问答推荐

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

为什么typescript不能推断类的方法返回类型为泛型''

状态更新后未触发特定元素的Reaction CSS转换

不推荐使用Marker类-Google map API警告

使用axios在ngOnInit中初始化列表

TypeScrip原始字符串没有方法

如何消除在Next.js中使用Reaction上下文的延迟?

为什么我的动画状态在组件实例之间共享?

React router 6(数据路由)使用数据重定向

如何正确地将元组表格输入到对象数组实用函数(如ZIP)中,避免在TypeScrip 5.2.2中合并所有值

如何静态键入返回数组1到n的函数

使用Cypress测试从Reaction受控列表中删除项目

VUE 3类型';字符串';不可分配给类型';参考<;字符串&>

我可以使用JsDocs来澄清Typescript实用程序类型吗?

在tabel管理区域react js上设置特定顺序

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

我如何键入它,以便具有字符串或数字构造函数的数组可以作为字符串或数字键入s或n

如何避免TS2322;类型any不可分配给类型never;使用索引访问时

递归地排除/省略两种类型之间的公共属性

为什么我们在条件语句中使用方括号[]?