【问题标题】:What's the difference between 'Pick<A & B, keyof A | keyof B> ' and 'A & B' in typescript'Pick<A & B, keyof A | 有什么区别?打字稿中的keyof B>'和'A&B'
【发布时间】:2021-11-07 22:10:48
【问题描述】:
type A = {
  a: number;
  b: string;
};
type B = {
  b: number;
  c: boolean;
};

我测试了extends关系,结果是真的:

type Expected1 = Pick<A & B, keyof A | keyof B> extends A & B ? true : false; // true
type Expected2 = A & B extends Pick<A & B, keyof A | keyof B> ? true : false; // true

但是 Equal 类型是虚假的:

type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false

type Expected3 = Equal<A & B, Pick<A & B, keyof A | keyof B>> // false

谁能告诉我为什么?

【问题讨论】:

  • 我通常看到Equal 写成更简单的type Equal&lt;X, Y&gt; = X extends Y ? Y extends X ? true : false : false,它在此处返回truetsplay.dev/wQKQjm 不是 100% 确定为什么相等性检查失败。
  • 附加一个关于这个Equal类型的reference link

标签: typescript types extends


【解决方案1】:

mattmccutchen 设计的 Equal 函数没有通过 this Github issue 中的测试 H

type A = number == string;// false
type B = 1 == 1;// true
type C = any == 1;// false
type D = 1 | 2 == 1;// false
type E = Head<[1,2,3]> == 1;// true(see:#24897)
type F = any == never;// false
type G = [any] == [number];// false
type H = {x:1}&{y:2} == {x:1,y:2}// true

这是一个创造性地利用条件类型的可分配性规则的解决方案,它要求扩展后的类型与检查器定义的“相同”:

导出类型等于 = (() => T 扩展 X ? 1 : 2) 扩展 (() => T 扩展 Y ? 1 : 2) ?真:假;

这通过了我能够运行的初始描述中的所有测试,除了 H,它失败了,因为“相同”的定义不允许交集类型与具有相同属性的对象类型相同。 (我无法运行测试 E,因为我没有 Head 的定义。)

您的示例完全属于 H 的情况。

这里是原始的github评论链接:https://github.com/Microsoft/TypeScript/issues/27024#issuecomment-421529650

【讨论】:

  • 非常感谢,我按照您提供的链接解决了我的疑问。
  • 完成!这是我第一次问问题:)
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2017-04-06
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多