[英]How to go from a mapped type to a discriminated union
抱歉,如果已经提出此问题。 我尽力找到解决方案,但可能找不到合适的术语。
我的问题始于这种结构。 这是一个简单的映射类型:
type Mapped = {
square: {
size: number;
};
rectangle: {
width: number;
height: number;
};
};
然后,我尝试创建一个联合类型:
type Unionize<T> = {
name: keyof T;
data: T[keyof T];
};
type Out = Unionize<Mapped>;
它产生这种类型:
type Generated = {
name: "square" | "rectangle";
data: {
size: number;
} | {
width: number;
height: number;
};
}
但是,实际上我想这样做的是,因为这样我就可以区分杠杆作用的联合来推断和检查数据属性。
type Wanted = {
name: "square";
data: {
size: number;
};
} | {
name: "rectangle";
data: {
width: number;
height: number;
};
}
与使用keyof T
独立生成name
和data
类型不同,首先使用映射类型为T
每个键组合正确的name
和data
,然后通过keyof T
对其进行索引以实现并集。
type Unionize<T> = {
[P in keyof T]: {
name: P;
data: T[P];
}
}[keyof T];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.