typescript 如何限制add(a:T,B:T):T,这样要么a和b是字符串,要么a和b是数字?

hgqdbh6s  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(129)

函数可以在js中定义如下:
function(a, b) {return a+b}
则允许调用如下:
add(1, 2)
add('hello', 'world')
但是,允许调用:
add(1, 'world')
以下代码无法满足上述要求:
function(a:string|number, b:string|number):string|number {return a+b}

如何在typescript中实现相同的代码?

z0qdvdin

z0qdvdin1#

我发现这个问题很有趣,因为这可能是TypeScript的一个合法限制。
简单地返回a + b的显而易见的解决方案不起作用,TypeScript抱怨T + T不能被操作,尽管我们知道ab必须是字符串或数字,并且这两种类型在串联或加法操作中都是有效的。
因此,我给你,没有任何铸造,这个问题的解决方案:

function add<T extends string | number>(a: T, b: T): T {
  return Array.from(arguments).reduce((t, c) => t + c);
}

console.log(add("Hello", " World!")); // "Hello World!"
console.log(add(4, 3)); // 7
add("Foo", 1337); // Error

Playground
应该注意的是,这是一种黑客,arguments产生any[],只有在非箭头函数可用。

相关问题