Diff类型中使用的TypeScript交集类型

时间:2017-11-10 01:00:19

标签: typescript

Diff类型

的定义中
type Diff<T extends string, U extends string> = ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T];

为什么& { [x: string]: never }部分不会“覆盖”前面的部分并简单地生成结果类型[x: string]: never(考虑T & never => never)?

1 个答案:

答案 0 :(得分:1)

出于同样的原因,不允许使用不兼容属性扩展索引签名的接口,但是交集是正确的:

interface N {
    [n: string]: string; 
}

interface Bad  extends N { // error
    i: number;
}

type Good = N & {  // ok
    i: number;
}

我能找到的最佳解释是两个单独的github问题中的这两条评论:

https://github.com/Microsoft/TypeScript/issues/13986

  

交叉点有点有趣,它是一个结合的类型运算符   类型,并保证不会导致错误。编译器信任   这些类型存在。这就是为什么你可以有数字之类的东西   &安培;串。该类型表明它是两种类型,separate.astring | undefinedvar a = "a"; separate[a]是字符串。

https://github.com/Microsoft/TypeScript/issues/18600

  

当你构建一个自相矛盾的A型时,我不知道   知道如何确定行为是什么&#34;期望&#34;什么不是。

所以现在我们在野外有Diff类型,人们开始使用它,我认为可以安全地假设这种对自相矛盾类型行为的特殊解释应该成为&#34;预期&#34;和#34;正常&#34;。