Typescript 是否可以使用映射类型更改属性形状?

Typescript 是否可以使用映射类型更改属性形状?,typescript,mapped-types,Typescript,Mapped Types,我有这样的字体 type Foo = { x : Bar<A> y : Bar<B> } type Flatten<T> = { [P in keyof T where T[P] extends {item: X}]: X; } 我想表达这种类型 { x: A y: B } 在伪代码中,它可能是这样的 type Foo = { x : Bar<A> y : Bar<B> } type Fl

我有这样的字体

type Foo = {
   x : Bar<A>
   y : Bar<B>
}
type Flatten<T> = {
    [P in keyof T where T[P] extends {item: X}]: X;
}
我想表达这种类型

{
  x: A
  y: B
}
在伪代码中,它可能是这样的

type Foo = {
   x : Bar<A>
   y : Bar<B>
}
type Flatten<T> = {
    [P in keyof T where T[P] extends {item: X}]: X;
}
类型展平={
[P在T的keyof中,其中T[P]扩展了{item:X}]:X;
}

可以这样做吗?

可以使用
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; }
类型A=字符串;
B类=数量;
类型Foo={
x:{item:A}
y:{项目:B}
}
类型M={
[n in keyof F]:F[n]['item']
}
类型U=M;//类型U={x:string;y:number;}

你能解释一下语法吗?它与
[n:string]
相同吗?对于
string
,它们是相似的
[n in string]
是一个键,而
[n:string]
是一个。索引签名是在映射类型之前添加到语言中的,索引类型只能是
string
number
,因此不能有
[n:keyof Foo]
。另一方面,接口可以声明索引签名-
接口I{[n:string]:string}正常,
接口I{[n in string]:string}不可用