我有一堆对象都有一个属性来区分它们。我将它们作为联合类型。现在我想创建一个从区别属性到实际类型的映射。我可以自己做,但它是双重的,容易出错,所以我想知道是否有某种方式用TypeScript以编程方式生成它。 :)
type X = { type: "x", x: number }
type Y = { type: "y", y: number }
type Value = X | Y
type Type = Value["type"]
// Is it possible to generate this?
type TypeToValue = {
x: X,
y: Y,
}
// Its useful for stuff like this
function getRecord<T extends Type>(type: T, id: string): TypeToValue[T] {
return null as any
}
答案 0 :(得分:1)
如果签名始终与您的帖子中的签名相同,而type
的值必须与关联属性匹配(例如x
| y
),则可以使用以下类型:
type TypeToValue<T extends Type> = { [P in T]: number } & { type: T }
可以按照以下方式使用:
declare function getRecord<T extends Type>(type: T, id: string): TypeToValue<T>
const { type, x } = getRecord('x', 'aa');
无法从与type
参数匹配的union类型中获取相应的类型。 TS Playground