Typescript 打字脚本+;联合类型上的运算符用法

Typescript 打字脚本+;联合类型上的运算符用法,typescript,Typescript,我试图通过(在本例中是内置的)操作符重载来教学生多态性之类的复杂问题,我创建了一个我认为应该有效但没有成功的示例。对于这个例子失败的原因,我希望Typescript专家能提供一些见解 function add2(a: number) { return a + 2; } // works fine, adds 2 and returns a number function concat2(a:string) { return a + 2; } // works fine, concate

我试图通过(在本例中是内置的)操作符重载来教学生多态性之类的复杂问题,我创建了一个我认为应该有效但没有成功的示例。对于这个例子失败的原因,我希望Typescript专家能提供一些见解

function add2(a: number) {
  return a + 2;
} // works fine, adds 2 and returns a number

function concat2(a:string) {
  return a + 2;
} // works fine, concatenates '2' and returns a string

function addOrConcatenateTwo(a: string | number) {
  return a + 2;
} 
// compile error. I THOUGHT it would return a string | number but it errors out no matter what.
我想Typescript会看到+是为字符串定义的,+也是为数字定义的,它会允许最后一个函数运行。这就是跨接口共享方法名的工作方式,那么为什么+运算符的工作方式不同呢

这很好,完全符合我认为上面的示例所做的。这是虫子吗?不可否认,这只会出现在人工教育场景中

function addOrConcatenateTwo(a: string | number) {
    if (typeof (a) == "string") {
        return a + 2;
    } else {
        return a + 2;
    }
}

尤其是下半场,能帮到你吗?本质上,+运算符不能处理联合类型。它可以!嗯,有点-它告诉我我所发现的事实上是真的,但它并没有真正说明原因。这是一个哲学上的决定(如果是的话,背后的理由是什么)还是仅仅是一个实现现实?这里不能为TS开发人员说话,所以只是一些猜测:我认为,上面是一个非常罕见的用例(在大多数情况下,您希望进行异或连接),团队可能已经决定,根据,此构造更有可能是一个错误。此外,还指出TS不被认为是“可靠的或“可证明正确的”类型的系统。相反,在正确性和生产力之间取得平衡。”因此,这可能是有利于实用性的一点。是一位开发人员在您的指导中提出的声明:“T+T,其中T扩展字符串|数字仍然是不允许的——我们认为这不是一个好的用例,因为您是否获得串联或加法是不可预测的,因此人们不应该这样做。”这可以更多地转换为简单的联合类型
string | number
,就像上面的例子一样。相反,这是一个(完全公平的)哲学决定。我甚至能理解!这只是意味着我必须直接跳转到方法重载来了解这个想法,这很好。谢谢你的时间!