对象解构中的类型

时间:2016-09-24 05:16:25

标签: typescript destructuring

$query = mysqli_query($connect, "SELECT * FROM weapons WHERE id IN (1, 8, 5, 3, 2,5) ");
while($row = $query->fetch_assoc())
{
echo $row['name'] . ', ' . $row['type'];
}

和这个

const { foo: IFoo[] } = bar;

会合理地导致错误。

这个

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

只会破坏const { foo: TFoo } = bar; 属性。

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

4 个答案:

答案 0 :(得分:67)

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

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

实际上并不比普通的

更好
const foo: IFoo[] = bar.foo;

答案 1 :(得分:26)

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

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

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

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

答案 2 :(得分:2)

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

不需要为对象属性指定类型,因为它们是根据已分解的对象推断出来的。

考虑到bar的键入正确,将推断出foo的类型:

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]

即使没有正确键入baranyunknown),也可以声明其类型:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]

答案 3 :(得分:1)

NextJS Typescript示例

我有这样的情况:

const { _id } = req.query;
if (_id.contains('whatever')) { // typescript complained
 ...
}

其中“ req.query”的键入类似于NextJS中的string | string[]……因此可以这样做:

const { _id } = req.query as { _id: string };
if (_id.contains('whatever')) { // typescript is fine
 ...
}

具有讽刺意味的是Typescript是正确的,但我不想做实际的编程工作来处理字符串和字符串数组。