gpt4 book ai didi

typescript - 为什么L extends AUnion,R extends AUnion没有重叠

转载 作者:行者123 更新时间:2023-12-05 02:35:02 26 4
gpt4 key购买 nike

这与对象 {} === {} 无关,

found this issues不知道这个是不是一样

类型集 - AUnion 不是空集。另外两种类型(LR)正在扩展它。我的理解是这些 L、R 至少和 AUnion 一样宽,因此我希望 L 和 R 中的元素没有空交集 - 即 AUnion。

我缺少 TypeScript 类型系统的哪一部分?

给定 TypeScript 代码

type AUnion = 'a'|'b';
type Proc = <L extends AUnion, R extends AUnion>(l:L, r:R)=>0|1;
declare const proc:Proc;

可以用两个相等的参数调用 proc

const arg:'a' = 'a';
proc(arg,arg); // this is fine (type-wise) 'a' does extend AUnion

据我所知,'a' 等于 'a'。它们的类型是 aa 扩展联合类型 AUnion

让我们来实现这个类型。


const proc:Proc = (l, r)=>{
if(l===r){
return 0;
}
return 1;
}

然而 TypeScript 提示

This condition will always return 'false' since the types 'L' and 'R' have no overlap.

Playground Link

我缺少什么?

最佳答案

根据各种 GitHub 问题,错误的存在是有意的,但错误的确切措辞并不总是合适的。参见 microsoft/TypeScript#25642 , microsoft/TypeScript#27910 , microsoft/TypeScript#41402 .

如果你有一个值x类型 X和一个值 y类型 Y , 那么规则是否为 x === y允许的是 XY必须是“可比较的”。这大致意味着 X extends YY extends X众所周知是真实的。如果这些都不是真的,那么 x === y将被禁止。

事实 X extends ZY extends Z对于某些第三种类型可能已知为真Z不会改变这一点。事实上,the unknown typetop type在 TypeScript 中,这意味着 X extends unknownY extends unknown对每个 X 都是真实的和 Y .所以 X 的事实和 Y受限于一些常见的父类(super class)型,实际上并不意味着 XY相互比较的适用性。

在你的例子中,L extends AUnionR extends AUnion , 但都不是 L extends R也不R extends L众所周知是真实的。所以编译器不允许比较。


至于具体的报错信息写法,不好x === y 可证明是不正确的当 false 时,“将始终返回 X”和 Y不是“可比较的”。当编译器说“XY 没有重叠”时,这听起来确实像是在说“X & Ynever”,但当然这不一定是真的。有这样的情况总是会返回 false (例如,如果 Xstring 并且 Ynumber ,或者如果 X{z: string} 并且 Y{z: number})。

但是X & Y的空虚真的不是问题。编译器将阻止 {x: string} 的比较和 {y: number}即使路口,{x: string; y: number} , 绝对不是空的。所以比较并没有真正被阻止,因为这两个值不可能相同;它被阻止是因为比较两个不直接相关的类型通常表示错误。


如果要比较两个类型被编译器认为“不可比较”的值,您总是可以将其中一个或两个扩展为可比较的类型。在您的情况下,您知道 LRAUnion相当, 所以你可以做类似的事情

const proc: Proc = (l, r) => {
const _l: AUnion = l;
const _r: AUnion = r;
if (_l === _r) { // okay
return 0;
}
return 1;
}

const proc: Proc = (l, r) => {
if (l as AUnion === r) { // okay
return 0;
}
return 1;
}

Playground link to code

关于typescript - 为什么L extends AUnion,R extends AUnion没有重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70641498/

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