typescript - 重叠类型的类型定义

标签 typescript typescript-generics typing

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

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/

相关文章:

python - 如何在可选类型中使用 numpy

generics - 在 TypeScript 的泛型函​​数中推断映射类型

python - 如何输入可变的默认参数

javascript - 从路由Angular中的子组件加载触发父组件中的事件

javascript - 使用组节点从多维子数组创建字符串

javascript - 使用 Angular 从选项下拉列表中过滤/搜索

javascript - AngularJS 1.5 : scope. $watch 内部链接函数不会在模型更改时更新

typescript - 避免对联合类型进行愚蠢的推断(元素隐式具有 'any' 类型,因为类型的表达式...)

TypeScript:自动完成但禁用推断

typescript 在编译时减去两个数字