根据联合类型选项键入

时间:2017-12-14 12:57:21

标签: typescript

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

type Direction = keyof DirectionMapping;

这相同,但保留了代码DRY。)

请注意,在运行时永远不需要DirectionMapping实例。而是在Result的定义中使用look up输出类型:

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 

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