对象解构中的类型


122

这个

const { foo: IFoo[] } = bar;

还有这个

const { foo: Array<IFoo> } = bar;

将合理地导致错误。

还有这个

const { foo: TFoo } = bar;

只会破坏TFoo财产。

如何为变形对象属性指定类型?


很好的问题,但是它是否能够从定义中推断出类型bar

2
在这里覆盖得很好。

@ user663031注释应被删除,因为它具有误导性。
浦佐助

@SasukeUchiha该文章不可用,但是大多数文章都可以通过文章标题搜索。它已移至mariusschulz.com/blog/…。它确实揭示了一些启示。
Estus Flask

这很有帮助。谢谢。
浦佐助

Answers:


189

事实证明,可以:为整个解构模式指定以下类型:

const {foo}: {foo: IFoo[]} = bar;

实际上,这没有什么比普通旧的更好

const foo: IFoo[] = bar.foo;

2
{foo}不是一个值。这就是通常所说的“解构分配模式”。您在这里看到的实际上是一种特殊的TypeScript功能,该功能允许将类型与此类模式相关联。

确实,这更像是一种特殊情况,尤其是与let x, y, z: string显然z只指定类型的情况相比。我更新了答案。
artem

55

我参加聚会显然有点晚了,但是:

interface User {
  name: string;
  age: number;
}

const obj: any = { name: 'Johnny', age: 25 };
const { name, age }: User = obj;

属性的类型nameage应该分别正确地推断为stringnumber


9
当您想为每个销毁使用接口时,这种情况很少见。
RA。

2

我自己的问题的后续行动。

不需要为对象属性指定类型,因为它们是从已分解的对象推断出来的。

考虑到bar键入正确,foo将推断出type:

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]

即使bar没有正确键入(anyunknown),也可以声明其类型:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.