- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这与对象 {} === {}
无关,
found this issues不知道这个是不是一样
类型集 - AUnion
不是空集。另外两种类型(L
和R
)正在扩展它。我的理解是这些 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'
。它们的类型是 a 和 a 扩展联合类型 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.
我缺少什么?
最佳答案
根据各种 GitHub 问题,错误的存在是有意的,但错误的确切措辞并不总是合适的。参见 microsoft/TypeScript#25642 , microsoft/TypeScript#27910 , microsoft/TypeScript#41402 .
如果你有一个值x
类型 X
和一个值 y
类型 Y
, 那么规则是否为 x === y
允许的是 X
和 Y
必须是“可比较的”。这大致意味着 X extends Y
或 Y extends X
众所周知是真实的。如果这些都不是真的,那么 x === y
将被禁止。
事实 X extends Z
和 Y extends Z
对于某些第三种类型可能已知为真Z
不会改变这一点。事实上,the unknown
type是top type在 TypeScript 中,这意味着 X extends unknown
和 Y extends unknown
对每个 X
都是真实的和 Y
.所以 X
的事实和 Y
受限于一些常见的父类(super class)型,实际上并不意味着 X
和 Y
相互比较的适用性。
在你的例子中,L extends AUnion
和 R extends AUnion
, 但都不是 L extends R
也不R extends L
众所周知是真实的。所以编译器不允许比较。
至于具体的报错信息写法,不好。 x === y
可证明是不正确的当 false
时,“将始终返回 X
”和 Y
不是“可比较的”。当编译器说“X
和Y
没有重叠”时,这听起来确实像是在说“X & Y
是never
”,但当然这不一定是真的。有这样的情况总是会返回 false
(例如,如果 X
是 string
并且 Y
是 number
,或者如果 X
是 {z: string}
并且 Y
是 {z: number}
)。
但是X & Y
的空虚真的不是问题。编译器将阻止 {x: string}
的比较和 {y: number}
即使路口,{x: string; y: number}
, 绝对不是空的。所以比较并没有真正被阻止,因为这两个值不可能相同;它被阻止是因为比较两个不直接相关的类型通常表示错误。
如果要比较两个类型被编译器认为“不可比较”的值,您总是可以将其中一个或两个扩展为可比较的类型。在您的情况下,您知道 L
和 R
与AUnion
相当, 所以你可以做类似的事情
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;
}
关于typescript - 为什么L extends AUnion,R extends AUnion没有重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70641498/
这段代码: interface I {} public class Test { TableView table; Test(ObservableList list) {
我们从 .NET 2.0 升级到 .NET 3.5。我的一位同事尝试在 Visual Studio 2008 中的调试器下运行 ASP .NET Web 项目时出现以下对话框。他可以正常构建,但无法调
我有一个具有class User extends Authenticatable的用户模型类,并且我也创建了另一个具有class Foo extends Model的模型类 这会在显示路线文件中的数据
我遇到的一个常见问题 @extend当试图用另一个 @extend 覆盖继承的属性时. 这是一个例子: // class selectors to be @extended // these coul
我对以下代码的 typescript 编译错误感到困惑: function f(x: T, y: S) { if (x === y) { // ERROR: This condition
这与对象 {} === {} 无关, found this issues不知道这个是不是一样 类型集 - AUnion 不是空集。另外两种类型(L 和R)正在扩展它。我的理解是这些 L、R 至少和 A
我收到以下错误: Extender Provider failed to return an Extender for this object 尝试为 .Net v4.7.2 加载 WCF 项目时。我
我收到以下错误: Extender Provider failed to return an Extender for this object 尝试为 .Net v4.7.2 加载 WCF 项目时。我
我刚刚在读Javascript: Module Pattern vs Constructor/Prototype pattern?我很好奇,当我们使用 $.fn.extend 或 $.extend 扩
我正在用 extend 做一些测试,在我做了一些观察后我有点困惑。初步观察: console.log($.extend === $.fn.extend); // trure // and since
我一直在使用一些通用方法从元素的可变参数创建集合,例如 public Set createSet( T... elements ) { ... 然而,最近我遇到了编译器没有按照我的预期去做的情况。以
刚去面试,问了一个问题。 面试官 - Java 是否支持多重继承? 我 - 不 面试官 - Java 中的每个类都扩展了类 Object(类 Object 除外),如果我们从外部扩展一个类,例如 Cl
我目前正在实现我的第一个 GWT 应用程序,我只是有一个快速的问题,关于在创建复杂的自定义小部件时 Extends Composite 和 Extend a specified widget 之间的区
使用 Observable 扩展 Object 和应用于以下类的扩展 Observable 之间有什么区别。 当应用程序运行时,结果是一样的。 library models; import 'pack
我制作了一个类装饰器,我想限制这个装饰器只能应用于某些类,所以我这样做了: @decorator() class A { foo:string; } @decorator() class B
在这个例子中: import java.util.*; public class Example { static void doesntCompile(Map> map) {} st
注意:这个问题与 Enum 无关,所以它不是重复的。Enum 被迫只与自身比较,因为编译器生成类型参数,而不是因为 java 递归类型参数。 我试图找到将类声明为的优势: public class S
我是 Java 的新手,正在尝试从 Java 泛型和集合一书中理解以下奇怪的语法。(我广泛使用 C++ 模板,因此可以声称了解泛型编程的基础知识和可能的陷阱): interface Collect
注意:这个问题与 Enum 无关,所以它不是重复的。Enum 被迫只与自身比较,因为编译器生成类型参数,而不是因为 java 递归类型参数。 我试图找到将类声明为的优势: public class S
有人知道是否可以延长 child Blade 吗? 我的应用程序有一个通用的布局模板,然后每个页面都从该模板@extends。每个页面都可以根据需要为其他 HTML block (例如模态)引入一系列
我是一名优秀的程序员,十分优秀!