对象解构中的类型

const { foo: IFoo[] } = bar;

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

会合理地引起错误。

const { foo: TFoo } = bar;

将只是解构TFoo属性。

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

134476 次浏览

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

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

接下来是我自己的问题。

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

考虑到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[]

NextJS Typescript示例

我有这样的场景:

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) ✅

如果你想要析构函数和重命名

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

我花了一点时间才弄清楚上面的问题