TypeScript 在类定义中允许使用不包含所有重载签名的实现签名,

m3eecexj  于 4个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(55)

🔎 搜索词

实现包含重载的类成员

🕗 版本与回归信息

  • 在所有我尝试过的版本中,这种行为都是如此,我也查看了关于重载类成员函数的常见问题解答条目。

⏯ Playground链接

https://www.typescriptlang.org/play?ts=5.2.2#code/FAYwNghgzlAEDCwDexZtgMwPZYBSwgH5YAuWAOwFcBbAIwFMAnWASlNgDcsBLAEwG5U6bHgLsqdJgBpYtcTQbM2ZLn0HpMOfBHmTGM2sTITFrdqt5C0KDRpBZyULGHoA6MFgDm+AC4BPAAd6LAwxFn5YAHpI2H8gkLFuOBMmK1gAX2BM4HJ6AHcEXBZXESKIqJiAxm5yHzgAIkpyXnoMGvpeeuAgA

💻 代码

class C
{
    foo( a? : number ) : void;
    foo( a : number, b : number ) : void;
    foo( a : number, b? : number ) : void
    {
        console.log( typeof a ); // typeof a is number
    }
}

new C().foo();  // prints "undefined"

🙁 实际行为

编译成功。
函数foo中的参数"a"的类型是number,但打印出的是"undefined",这是错误的。
由于foo的实现签名没有包含所有重载签名,所以编译应该失败。

🙂 预期行为

编译应该失败。

yfjy0ee7

yfjy0ee71#

我同意这是一个bug。在比较重载实现和重载列表时,我们不应该考虑方法二元性。
这个错误很可能会导致大量不必要的中断,最终导致我们拒绝修复 🫠

相关问题