如何根据另一个字段值创建字段类型?

How to create a field type based on another field value?

我正在尝试为以下简化示例编写类型。
我如何告诉 Container 配置将从 component 派生?

type Container = {
  component: "A" | "B" | "C";
  config: AConfig | BConfig | CConfig;
}

type App = {
  containers: Container[];
}

我试过使用泛型,但是 App 中的 containers 不能有多个类型。

type Config = {
  A: AConfig;
  B: BConfig;
  C: CConfig;
}

type Container<T extends keyof Config> = {
  component: T;
  config: Config[T];
}

type App<T> = {
  containers: Container<T>[];
}

您需要一个映射类型来迭代 Config 类型的键并创建配对。

type ConfigContainer = {
    [K in keyof Config]: { component: K, config: Config[K] }
}[keyof Config]

这将创建一个对象类型,该对象类型将所有可能的配对作为值,然后您通过该对象自己的键对该对象进行索引,以获取作为联合的值类型。

See Playground