我正在try 创建一个具有两个参数的函数,这两个参数应该是相同类型的.该类型可以是类型列表中的任何类型,这些类型本身就是字符串文字的列表.

type A = "A1" | "A2" | "A3";
type B = "B1" | "B2" | "B3";
type Union = A | B;

type params<T> = T extends Union ? {input: T, output: T} : never;
function test(params: params<Union>) {
  ...
}

预期:

type params<Union> = {input: A, output: A} | {input: B, output: B}

会发生什么:

type params<Union> = {input: "A1", output: "A1"} | {input: "A2", output: "A2"} | {input: "A3", output: "A3"} | {input: "B1", output: "B1"} | {input: "B2", output: "B2"} | {input: "B3", output: "B3"}

推荐答案

不要将联合类型传递给params<T>泛型.相反,创建接受两个独立类型的泛型类型-InputOutputUnion<A, B>:

type A = "A1" | "A2" | "A3";
type B = "B1" | "B2" | "B3";

type InputOutput<T> = { input: T, output: T }
type InputOutputUnion<T, U> = InputOutput<T> | InputOutput<U>
type Params = InputOutputUnion<A, B>

let params1: Params = { input: "A1", output: "A2" }    // correct
let params2: Params = { input: "B1", output: "B2" }    // correct
let params3: Params = { input: "A1", output: "B1" }    // error

您还可以使用允许多个联合的更通用的解决方案:

type InputOutputUnionN<T extends any[]> =
  | InputOutput<T[0]>
  | InputOutput<T[1]>
  | InputOutput<T[2]>
  | InputOutput<T[3]>
type Params = InputOutputUnionN<[A, B]>

Typescript相关问答推荐

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

键集分页顺序/时间戳上的筛选器,精度不相同

类型,其中一条记录为字符串,其他记录为指定的

类型脚本满足将布尔类型转换为文字.这正常吗?

有没有可能产生输出T,它在视觉上省略了T中的一些键?

正交摄影机正在将渲染的场景切成两半

返回嵌套props 的可变元组

我怎样才能正确地输入这个函数,使它在没有提供正确的参数时出错

对有效枚举值的常量字符串进行常规判断

如何将通用接口的键正确设置为接口的键

使用强类型元组实现[Symbol.iterator]的类型脚本?

TaskListProps[]类型不可分配给TaskListProps类型

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

垫子工具栏不起作用的Angular 布线

映射类型不是数组类型

从联合提取可调用密钥时,未知类型没有调用签名

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?

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

传入类型参数<;T>;变容函数

React-Router V6 中的递归好友路由