typescript 如何判断一个数组某一个值是否在另一个数组存在?

const routes = [{
   routerId: '123',
   stop: 12
}];

const routeStep = [{
    routerId: "123",
    steps: [{
       duration: 123,
       distance: 345
    }]
}]
我想在循环中判断routerId = 123的元素是否存在routeStep变量中,并且返回 routeStep元素,但是提示Have no overlap.我查了文档一些资料,但是不知道怎样应用,希望你能给我一些建议或者适用的方法,谢谢~
const routes = [{
   routerId: '123',
   stop: 12
}];

const routeStep = [{
    routerId: "123",
    steps: [{
       duration: 123,
       distance: 345
    }]
}]

const find = <T, S, TK extends keyof T, SK extends keyof S>(args1: T, args2: S, key1: TK, key2: SK): T | undefined =>{
    return args1.find((arg1: T) => {
         return args2.findIndex((arg2: S) => arg2[key2] === arg1[key1]) !== -1;
    })
}
阅读 9.2k
2 个回答

我大概明白你的意思了,你想限制第 3/4 个参数的类型:必须是前两个参数的 key。

但是随之而来的问题是:你并没有限制第一个参数和第二个参数一定具有相同的 key。因此 ts 推导出 S[SK]T[TK] 没有交集,肯定是 false

然而,作为代码的作者,你是明确知道 S[SK]T[TK] 可能相同,也可能不相同,所以“你可以告诉 ts 编译器这两个值可能相等”,因此加个类型转换可以解决这个问题。

或者你还可以问问自己,对于第三个,第四个参数的限制是否有必要?

虽然你也做了足够的限时,但是使用者是否会以如下方式使用呢:

find(routeStep, routes, 'steps', 'stop')

很多时候不要纠结于 ts 的自动类型推导,尤其是内部实现某些功能的时候,完全可以由开发者主动告诉 ts 的类型。

对于接口/类/函数签名,则需要提供更严格的类型约束。

可以换个思路:

const routeStepIndex = routeStep.reduce((acc, item) => {acc[item.routerId] = item; return acc}, {});

这样,就简单了:

const find = (key) => routeStepIndex[key];
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题