对象解构中的类型
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;
属性类型 name
和 age
应该分别正确推断为 string
和 number
。
我自己的问题的后续。
不需要为对象属性指定类型,因为它们是从解构对象中推断出来的。
考虑到 bar
的输入正确,foo
类型将被推断为:
const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]
即使 bar
没有正确输入(any
或 unknown
),它的类型也可以断言:
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;
我花了一秒钟才弄清楚上面的内容
这个
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;
属性类型 name
和 age
应该分别正确推断为 string
和 number
。
我自己的问题的后续。
不需要为对象属性指定类型,因为它们是从解构对象中推断出来的。
考虑到 bar
的输入正确,foo
类型将被推断为:
const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]
即使 bar
没有正确输入(any
或 unknown
),它的类型也可以断言:
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;
我花了一秒钟才弄清楚上面的内容