在typescript中使用lodash groupBy方法时在接口中引用另一个接口

问题描述 投票:0回答:1

我有一个数据库模型接口

User
。我想获取所有用户并将它们存储在 lodash 中带有
groupBy()
的键值对中,如下所示:

const users: {[_id: string]: User} = _.groupBy(await db.Users.find(), '_id');
// users = {'x': {_id: 'x', name: 'Rifat'}, 'y': {_id: 'y', name: 'Reza'}}

这给了我这个错误

Type 'Dictionary<(Document<unknown, any, User> & Omit<User & Required<{ _id: string; }>, never>)[]>' is not assignable to type '{ [_id: string]: User; }'. 'string' index signatures are incompatible.

最终我希望能够做这样的事情:

const user = users['x']; // which should treat user as User
typescript interface lodash
1个回答
0
投票

Loadash 的

groupBy
返回一个对象,其中每个属性都是共享组键的项目的 array

所以:

const things = [{ name: 'foo', tag: 'a' }, { name: 'bar', tag: 'a' }]
const grouped = _.groupBy(thing => thing.tag)
// { 'a': [{ name: 'foo', tag: 'a' }, { name: 'bar', tag: 'a' }] }

这意味着您需要将类型设置为

{ [_id: string]: User[] }
(请注意
[]
使其成为数组)。

添加这一点后,您的代码就可以正常工作了:

const users: { [_id: string]: User[] } = _.groupBy(await db.Users.find(), '_id');

看游乐场


但是,考虑到这是来自数据库的用户列表,他们可能都有一个唯一的

_id
。这意味着您可能根本不需要
groupBy
方法,因为您不想要 groups 用户。您可能需要
keyBy
,它返回一个对象,其中每个数组成员的某些属性成为返回对象中的键。

因此,如果您将其更改为

keyBy
那么您的原始类型就可以正常工作:

const users: { [_id: string]: User } = _.keyBy(await db.Users.find(), '_id');

看游乐场


最后,您可能甚至不需要这里显式类型。你让 Typescript 根据使用情况推断

users
的类型,它也能正常工作。

const users = _.keyBy(await db.Users.find(), '_id');
const user = users['x'] // type: User

看游乐场

© www.soinside.com 2019 - 2024. All rights reserved.