如何在TypeScript中使通用加法运算符与数字和字符串一起使用

时间:2019-01-31 22:44:35

标签: typescript generics operators type-inference type-constraints

在学习TypeScript中的泛型时,我想尝试重新创建以下JavaScript:

function add(x, y){
    return x + y;
}

我尝试过:

type StringOrNumber = string | number;

function add<MyType extends StringOrNumber>(x: MyType, y: MyType): MyType {
    return x + y;
}

此错误:

error TS2365: Operator '+' cannot be applied to types 'MyType' and 'MyType'.

为什么这行不通?我假设MyType可以是字符串,也可以是数字,一旦“选择”了TypeScript,便知道它是在两个字符串两个数字上加一个。

1 个答案:

答案 0 :(得分:2)

也可能发生的情况是MyType可以是string | number extends的{​​{1}}。例如,StringOrNumber是对具有您定义的签名的函数的完全有效的调用。扩展并集类型的类型并不意味着“精确选择一个”。

由于您的签名很有意义,并且您正在学习泛型,因此我们希望继续使用它,因此我们也可以在此时关闭类型检查。有时候,打字稿确实无法弄清您的复杂情况,此时您只能选择add<string | number>('', 1);放弃类型检查。

处理这种情况的另一种方法是使用如下所示的重载签名

return (x as any) + y