This
const { foo: IFoo[] } = bar;
and this
const { foo: Array } = bar;
will reasonably cause
A follow-up to my own question.
Types don't need to be specified for object properties because they are inferred from destructured object.
Considering that bar
was typed properly, foo
type will be inferred:
const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]
Even if bar
wasn't correctly typed (any
or unknown
), its type can be asserted:
const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
It turns out it's possible to specify the type after :
for the whole destructuring pattern:
const {foo}: {foo: IFoo[]} = bar;
Which in reality is not any better than plain old
const foo: IFoo[] = bar.foo;
I'm clearly a bit late to the party, but:
interface User {
name: string;
age: number;
}
const obj: any = { name: 'Johnny', age: 25 };
const { name, age }: User = obj;
The types of properties name
and age
should be correctly inferred to string
and number
respectively.
I had scenarios like so:
const { _id } = req.query;
if (_id.contains('whatever')) { // typescript complained
...
}
in which the "req.query" was typed like string | string[]
from NextJS... so doing this worked:
const { _id } = req.query as { _id: string };
if (_id.contains('whatever')) { // typescript is fine
...
}
The irony of this is Typescript was correct but I don't want to do the actual programming work to handle strings and string arrays.