TypeScript 空交点作为函数返回类型不被视为永远不会发生,

rkue9o1l  于 6个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(67)

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.

🙂 预期行为

f2g2 应该分别生成与 f1g1 相同的错误,除了对空交集类型的详细说明。
注意:有人建议将修复与 #47751 分开,如果这真的是个bug,我已经准备好提交另一个PR了。

mklgxw1f

mklgxw1f1#

我在这里并没有看到明显的缺陷,g2仍然存在错误。我们没有给它关于never的特殊错误信息,但这个错误实际上是在告诉你同样的事情,为什么有人会故意编写这样的代码呢?

lh80um4z

lh80um4z2#

这是否真的告诉你同样的事情?如果我在g2上看到当前的错误消息,我会尝试返回一些东西,直到我注意到返回类型是never。更糟糕的是,如果我试图在函数末尾添加return;,只是为了取悦编译器(当然不应该这样做!),g2会变成f2,在strictNullChecks: false下不会发出任何错误。
我理解上面的代码是牵强的,但这可能在大型的代码库中出现,使用泛型,可能是通过不小心声明一个函数的返回类型为空交集。引用来自#36696(评论):
显然很少有人会故意将类型注解设置为显式交叉不相交的类型,就像上面的例子一样。空交集的根本原因是通常示例化了与类型参数相交的泛型类型。
看到没有人报告过这是一个bug,我可以说没有人会真正面对这样的事情,但我认为修复这个问题会让编译器对用户更加友好。

0vvn1miw

0vvn1miw3#

snc: false下不报错是正确的,因为{ p: undefined }是一个合法的返回值。

zaqlnxep

zaqlnxep4#

如果改进这个功能很简单,我们可以进行PR,但如果它复杂或者有其他副作用,我会认为这不是一个缺陷。

8i9zcol2

8i9zcol25#

snc: false下不报错是正确的,因为{ p: undefined }是一个合法的返回值。
我以为#36696A & B等效于never,所以这四个函数在snc: false下都不能返回任何东西吗?只是再检查一下。

相关问题