运算符'+'不能应用于类型'T'和'T'。在TypeScript中

问题描述 投票:1回答:3

我对TypeScript非常陌生。我的TypeScript版本是3.7.5。

恕我直言,它应该非常容易,但是我不知道为什么它不起作用。

function add<T> (a:T, b:T):T  {
    return a + b ;
}

console.log(add (5,6));

我收到错误:

运算符'+'不能应用于类型'T'和'T'。

我也使用过这个:

function add<T extends string | number > (a:T, b:T):T

存在相同的错误。如果我不能为这个泛型使用+,为什么我应该使用泛型

typescript generics types
3个回答
1
投票

看来有必要像这样设置约束:

add<T extends number> (a:T, b:T):number  {
    return a + b ;
}

Tstring

add<T extends string> (a:T, b:T):string  {
    return a + b ;
}

此版本不适用,因为您无法预测是级联还是添加。

add<T extends string | number > (a:T, b:T):T {

}

1
投票

在这里泛型不是正确的方法。您不能将+运算符应用于不受约束的T(为什么要这样做?)。function add<T extends string | number > (a:T, b:T):T也不起作用,因为TS要求至少一个操作数为string,在这里不是这种情况。例如。那这个星座呢:

const sn1 = 3 as number | string
const sn2 = "dslf" as number | string
add(sn1,sn2) // both types have type number | string, sh*t...

+运算符不能在JS中重载,但我们仍然可以重载函数:

function add(a: string, b: string): string
function add(a: number, b: number): number
function add(a: any, b: any) {
    return a + b;
}

add(1, 2) // number
add("foo", "bar") //string

0
投票

这是工会的补充

function add<T extends string | number>(a: T, b: T): T extends string ? string : number  {
  return  <any>a + <any>b; // cast to any as unions cannot be added, still have proper typings applied
}

const res1 = add(5, 6) // number
const res2 = add('a', 'b') // string

playground

© www.soinside.com 2019 - 2024. All rights reserved.