首页 > 解决方案 > 当成员之一存在时,具有可选成员的通用映射类型约束不约束

问题描述

const abc = <T extends object, P extends { [key in keyof T]?: number }>(
  a: T,
  b: P
) => {
  console.log(a, b);
};

const A = { x: "1", y: "2", z: "3" };
const b = { x: 1, y: 2, z: 3 };
const b1 = { x: 1, y: 2 };
const b3 = { m: 5 };
const b4 = { m: 5, x: 1 };

abc(A, b);
abc(A, b1);
abc(A, b3); // Type '{ m: number; }' has no properties in common with type '{ x?: number | undefined; y?: number | undefined; z?: number | undefined; }'
abc(A, b4); // expect type error just like b3 but it is not

既然m不存在Ab4应该错误喜欢b3吗?但为什么它不是错误以及如何解决它?

这是沙盒 代码和框

标签: typescripttypescript-generics

解决方案


键入'{ m:数字;}' 与类型 '{ x?: number | 没有共同的属性。不明确的; y?: 数字 | 不明确的; z?: 数字 | 不明确的; }。

认为它很清楚,b4 没有错误,因为有 x?, y? 之一 z? 包括。那是因为您从 T 扩展,而 T 来自您传递的第一个参数是 A。


推荐阅读