我有这样的类型
type Foo = {
x : Bar<A>
y : Bar<B>
}
或
type Foo = {
x: {item:A}
y: {item:B}
}
我想表达这种类型
{
x: A
y: B
}
在伪代码中,它可能看起来像这样
type Flatten<T> = {
[P in keyof T where T[P] extends {item: X}]: X;
}
是否可以做这样的事情?
答案 0 :(得分:1)
可以使用Foo
的第二个变体,其中每个成员的类型本身都是一个具有相同名称(item
)的成员,因此您可以使用索引访问类型运算符映射类型中的['item']
:
type A = string;
type B = number;
type Foo = {
x: {item:A}
y: {item:B}
}
type M<F extends {[n in string]: { item: {} }}> = {
[n in keyof F]: F[n]['item']
}
type U = M<Foo>; // type U = { x: string; y: number; }