如何解决流类型是一个通用函数,它对至少具有 ID
我正在尝试使用 Flow 输入一个将 As 映射到 Bs 的函数,其中唯一的限制是:
除此之外,A 可以是任何对象,在这种情况下,B 是众所周知的。 我想用泛型/多态类型键入函数,以便类型检查器知道您将获得包含匹配的 A 和 B 的对象数组。
我在下面的尝试没有给我任何类型错误,但我认为它也不正确。 很想了解如何正确键入此内容,以便您获得最大的保证。
type B = {A: {id: string}}
const BContainsA = (id: string) => (b: B) =>
b.A.id === id
type MapResult<T> = {
AsWithBs: Array<{ A: T,B: B }>,AsWithoutBs: string[],}
const mapAsToBs = <T>(
As: { ...T,id: string }[],Bs: B[]
): MapResult<T> => {
return As.reduce(
(result,a) => {
const b = Bs.find(BContainsA(a.id))
if (!b) {
result.AsWithoutBs.push(a.id)
return result
}
result.AsWithBs.push({ A: a,B: b })
return result
},{ AsWithBs: [],AsWithoutBs: [] }
)
}
mapAsToBs([{pos:2,id: '1'},{pos:1,id: '11'}],[{A:{id: '1'}}])
解决方法
似乎我所要做的就是为泛型类型添加一个约束,如下所示:
const mapAsToBs = <T:{id: string}>(
As: T[],Bs: B[]
): MapResult<T> => {
}
它是indeed documented,但语法太不直观,解释太短,我只是阅读它是猜不出来的。
您可以检查它是如何按预期工作的here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。