我想为一个函数创建类型定义,该函数采用两个不同类型的对象但具有一组通用的键:
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]
不要重叠。我不完全明白。任何提示或想法?
最佳答案
一个奇怪的解决方案,但它似乎在简单的例子中工作。
Playground Link
function myFunc<
L extends Pick<R, (keyof R & keyof L)>,
R extends Pick<L, (keyof R & keyof L)>,
K extends (keyof R & keyof L)>
(left: L, right: R, keys: K[]): { left: L, right: R }
{
for (const key of keys) {
console.log(key, left[key] === right[key])
}
return { left, right }
}
const left = { a: 1, b: 2, c: 4 };
const right = { b: 2, c: 3, d: 5 };
// Work:
myFunc(left, right, [ 'b' ]);
myFunc(left, right, [ 'b', 'c' ]);
// Error: Type '<>' is not assignable to type '"b" | "c"'.
myFunc(left, right, [ 'a' ]);
myFunc(left, right, [ 'd' ]);
myFunc(left, right, [ 'z' ]);
但是,如果与重叠键对应的值的类型不匹配,它似乎确实存在一些问题。修复它可能是一个棘手的方法。总的来说,最好关闭那个
===
的类型检查。如果可能的话。
关于typescript - 重叠类型的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64891328/