对象解构中的类型

Est*_*ask 74 destructuring typescript

这个

const { foo: IFoo[] } = bar;
Run Code Online (Sandbox Code Playgroud)

还有这个

const { foo: Array<IFoo> } = bar;
Run Code Online (Sandbox Code Playgroud)

会合理地导致错误.

还有这个

const { foo: TFoo } = bar;
Run Code Online (Sandbox Code Playgroud)

将只是破坏TFoo财产.

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

art*_*tem 113

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

const {foo}: {foo: IFoo[]} = bar;
Run Code Online (Sandbox Code Playgroud)

实际上,这并不比普通老年人好

const foo: IFoo[] = bar.foo;
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要进行多次解构,第一个会更好。但这条线会变得很丑,单独的线可能会更好。 (3认同)
  • 但是`{foo}`不是值。这就是通常所说的“解构分配模式”。您在这里看到的实际上是一种特殊的TypeScript功能,该功能允许将类型与此类模式相关联。 (2认同)

Ste*_*aul 36

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

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

const obj: any = { name: 'Johnny', age: 25 };
const { name, age }: User = obj;
Run Code Online (Sandbox Code Playgroud)

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

  • 当您想为每个销毁使用接口时,这种情况很少见。 (2认同)

Est*_*ask 14

我自己的问题的后续。

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

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

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]
Run Code Online (Sandbox Code Playgroud)

即使bar未正确键入(anyunknown),也可以断言其类型:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
Run Code Online (Sandbox Code Playgroud)

  • 仅当解构类型化对象时才是如此。如果破坏以“any”形式出现的内容,那么您需要键入该变量或破坏的变量。 (7认同)

Jas*_*ing 9

NextJS 打字稿示例

我有这样的场景:

const { _id } = req.query
if (_id.substr(2)) { 
 ...
}
Run Code Online (Sandbox Code Playgroud)

其中的req.query类型是

type ParsedUrlQuery = { [key: string]: string | string[] }
Run Code Online (Sandbox Code Playgroud)

所以这样做有效:

const { _id } = req.query as { _id: string }
if (_id.substr(2)) { 
 ...
}
Run Code Online (Sandbox Code Playgroud)

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

const _id = (req.query._id || '').toString() ? 
Run Code Online (Sandbox Code Playgroud)

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

const qs = (
  (q: ParsedUrlQuery) => (k: string) => (q[k] || '').toString()
)(req.query) 
Run Code Online (Sandbox Code Playgroud)

我可以像这样重用:

const _id = qs('_id') 
Run Code Online (Sandbox Code Playgroud)


小智 8

如果你想析构并重命名:

const {foo: food}: {foo: IFoo[]} = bar;
Run Code Online (Sandbox Code Playgroud)

我花了一秒钟才把上面的内容弄对。