【发布时间】:2021-03-01 14:49:41
【问题描述】:
我想为一个函数创建类型定义,该函数接受两个不同类型的对象,但具有共同的键集:
function myFunc(left, right, keys) {
// simplified:
for (const key of keys) {
console.log(key, left[key] === right[key])
}
return { left, right }
}
const left = {a: 1, b: 2}
const right = {b: 2, c: 3}
myFunc(left, right, ["b"])
这种方法有效,但会改变返回的 right 的类型,这在函数调用后的代码中会咬我:
function myFunc<
Left,
Keys extends keyof Left
>(
left: Left,
right: Pick<Left, Keys>,
keys: Keys[],
): {
left: Left
right: Pick<Left, Keys>
} {
// ...
}
我希望返回的类型相同:
function myFunc<
Left,
Right extends Pick<Left, Keys>,
Keys extends keyof Left & keyof Right
>(
left: Left,
right: Right,
keys: Keys[]
): {
left: Left
right: Right
} {
// ...
}
但是,现在我收到Left[Keys] 和Right[Keys] 类型不重叠的抱怨。我没有完全理解。
任何提示或想法?
【问题讨论】:
标签: typescript typescript-generics typing