对象解构中的类型

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

我自己的问题的后续。

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

考虑到 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 = (req.query._id || '').toString() ✅ 

或者像这样制作一些辅助方法:

const qs = (
  (q: ParsedUrlQuery) => (k: string) => (q[k] || '').toString()
)(req.query) 

我可以像这样重用:

const _id = qs('_id') 

如果要析构和重命名

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

我花了一秒钟才弄清楚上面的内容