繁体   English   中英

对象解构中的类型

[英]Types in object destructuring

这个

const { foo: IFoo[] } = bar;

和这个

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

会合理地导致错误。

和这个

const { foo: TFoo } = bar;

只会破坏TFoo属性。

如何为解构对象属性指定类型?

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

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

这实际上并不比普通的旧

const foo: IFoo[] = bar.foo;

我显然有点迟到了,但是:

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

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

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

NextJS 打字稿示例

我有这样的场景:

const { _id } = req.query
if (_id.substr(2)) { 🚫
 ...
}

其中req.query的类型如下

type ParsedUrlQuery = { [key: string]: string | string[] }

所以这样做有效:

const { _id } = req.query as { _id: string }
if (_id.substr(2)) { 🆗
 ...
}

具有讽刺意味的是,Typescript 是正确的,我应该这样做:

const _id = String(req.query._id) ✅ 

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

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

考虑到bar输入正确,将推断foo类型:

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[]

如果你想析构和重命名

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

花了我一秒钟才把上面的东西弄好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM