typescript 字符串文字联合的分布式条件类型

sd2nnvve  于 2023-11-20  发布在  TypeScript
关注(0)|答案(1)|浏览(167)

我试图创建一个函数,它有两个参数,这两个参数应该是相同的类型。这个类型可以是一个类型列表中的任何一个,这些类型本身就是一个字符串字面量列表。

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"}

laik7k3q

laik7k3q1#

不要将unioned类型传递到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]>

相关问题