【问题标题】:Type based on union type option基于联合类型选项的类型
【发布时间】:2017-12-14 21:49:51
【问题描述】:

我想创建一个对象,其中属性名称是联合类型的值,值的类型基于该道具类型,例如:

type Direction =
  "horizontal"
  | "vertical"
  | "diagonal"
  ;

// Choose one of this types based on Direction option
interface HorizontalData { foo: number; }
interface VerticalData { bar: string; }
interface DiagonalData { baz: boolean; }

type Result<D extends Direction> = {
  data: << type based on D value >>;
};

【问题讨论】:

    标签: typescript


    【解决方案1】:

    是的,这是可能的。您可以定义一个类型,表示从每个属性名称到对应的***Data 的映射,如下所示:

    type DirectionMapping = {
      "horizontal": HorizontalData
      "vertical": VerticalData
      "diagonal": DiagonalData
    };
    

    (旁白:如果您愿意,可以删除 Direction 的原始定义并将其替换为:

    type Direction = keyof DirectionMapping;
    

    这相当于同一件事,但保留您的代码DRY。)

    请注意,在运行时您永远不需要DirectionMapping实例。相反,您将其用于look up Result 定义中的输出类型:

    type Result<D extends Direction> = {
      data: DirectionMapping[D]; // uses indexed-access/lookup type 
    };
    

    并测试它的行为是否符合预期:

    const horz: Result<"horizontal"> = { data: { foo: 3 } }; // okay
    const vert: Result<"vertical"> = { data: { foo: 3 } }; // error 
    

    希望对您有所帮助。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多