我想创建一个对象,其中属性名称是联合类型的值,以及基于该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 >>;
};
答案 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
希望有所帮助。祝你好运!