从有区别的union属性映射到对象类型

时间:2017-12-21 21:24:52

标签: typescript typescript-typings

我有一堆对象都有一个属性来区分它们。我将它们作为联合类型。现在我想创建一个从区别属性到实际类型的映射。我可以自己做,但它是双重的,容易出错,所以我想知道是否有某种方式用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
}

1 个答案:

答案 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