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;
})
}
我大概明白你的意思了,你想限制第 3/4 个参数的类型:必须是前两个参数的 key。
但是随之而来的问题是:你并没有限制第一个参数和第二个参数一定具有相同的 key。因此 ts 推导出
S[SK]
和T[TK]
没有交集,肯定是false
。然而,作为代码的作者,你是明确知道
S[SK]
和T[TK]
可能相同,也可能不相同,所以“你可以告诉 ts 编译器这两个值可能相等”,因此加个类型转换可以解决这个问题。或者你还可以问问自己,对于第三个,第四个参数的限制是否有必要?
虽然你也做了足够的限时,但是使用者是否会以如下方式使用呢:
很多时候不要纠结于 ts 的自动类型推导,尤其是内部实现某些功能的时候,完全可以由开发者主动告诉 ts 的类型。
对于接口/类/函数签名,则需要提供更严格的类型约束。