gpt4 book ai didi

typescript - 重叠类型的类型定义

转载 作者:行者123 更新时间:2023-12-04 15:12:48 24 4
gpt4 key购买 nike

我想为一个函数创建类型定义,该函数采用两个不同类型的对象但具有一组通用的键:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com