Bug报告
🔎 搜索词
空交集,从不,返回类型
🕗 版本与回归信息
- 在所有我尝试的版本中,我都发现了这种行为,我也查看了关于类型的常见问题解答。
⏯ Playground链接
strictNullChecks: false
strictNullChecks: true
💻 代码
type A = { p: "A" };
type B = { p: "B" };
function f1(): never {
return;
}
function f2(): A & B {
return;
}
function g1(): never {}
function g2(): A & B {}
🙁 实际行为
f1: Type 'undefined' is not assignable to type 'never'.
(预期)
f2 w/ strictNullChecks: false
: 没有错误发出
f2 w/ strictNullChecks: true
: Type 'undefined' is not assignable to type 'never'. The intersection 'A & B' was reduced to 'never' because property 'p' has conflicting types in some constituents.
(预期)
g1: A function returning 'never' cannot have a reachable end point.
(预期)
g2: A function whose declared type is neither 'void' nor 'any' must return a value.
🙂 预期行为
f2
和 g2
应该分别生成与 f1
和 g1
相同的错误,除了对空交集类型的详细说明。
注意:有人建议将修复与 #47751 分开,如果这真的是个bug,我已经准备好提交另一个PR了。
5条答案
按热度按时间mklgxw1f1#
我在这里并没有看到明显的缺陷,
g2
仍然存在错误。我们没有给它关于never
的特殊错误信息,但这个错误实际上是在告诉你同样的事情,为什么有人会故意编写这样的代码呢?lh80um4z2#
这是否真的告诉你同样的事情?如果我在
g2
上看到当前的错误消息,我会尝试返回一些东西,直到我注意到返回类型是never
。更糟糕的是,如果我试图在函数末尾添加return;
,只是为了取悦编译器(当然不应该这样做!),g2
会变成f2
,在strictNullChecks: false
下不会发出任何错误。我理解上面的代码是牵强的,但这可能在大型的代码库中出现,使用泛型,可能是通过不小心声明一个函数的返回类型为空交集。引用来自#36696(评论):
显然很少有人会故意将类型注解设置为显式交叉不相交的类型,就像上面的例子一样。空交集的根本原因是通常示例化了与类型参数相交的泛型类型。
看到没有人报告过这是一个bug,我可以说没有人会真正面对这样的事情,但我认为修复这个问题会让编译器对用户更加友好。
0vvn1miw3#
在
snc: false
下不报错是正确的,因为{ p: undefined }
是一个合法的返回值。zaqlnxep4#
如果改进这个功能很简单,我们可以进行PR,但如果它复杂或者有其他副作用,我会认为这不是一个缺陷。
8i9zcol25#
在
snc: false
下不报错是正确的,因为{ p: undefined }
是一个合法的返回值。我以为#36696和
A & B
等效于never
,所以这四个函数在snc: false
下都不能返回任何东西吗?只是再检查一下。