TypeScript 泛型函数如何处理类型“T”与“number”的加法运算?

运算符“+”不能应用于类型“T”和“number”

function addNum<T>(num: T): T {
    if (typeof num === 'string') {
        return num
    }
    if (num >= 20) {
        return num
    } else {
        return addNum(num + 1) // 运算符“+”不能应用于类型“T”和“number”。
    }
}
console.log(addNum<number>(1));
阅读 818
2 个回答
type paramType = string | number
function addNum<T extends paramType>(num: T): T {
  if (typeof num === 'string') {
    return num
  }
  if (typeof num === 'number') {
    if (num >= 20) {
      return num
    } else {
      return (num + 1) as T
    }
  }
  return num
}
console.log(addNum<number>(1));
function addNum<T extends number>(num: T): T {  
    if (num >= 20) {  
        return num;  
    } else {  
        // 由于 T 已经是 number 类型,这里不需要额外的断言  
        return addNum(num + 1);  
    }  
}  
  
console.log(addNum<number>(1)); // 这里 <number> 是多余的,因为 T 已经被约束为 number  
console.log(addNum(1)); // 更简洁的调用方式

注意,在这个修改后的版本中,我移除了对 typeof num === 'string' 的检查,因为这个检查在 T extends number 的约束下是多余的。此外,我也移除了 <number> 类型参数,因为 TypeScript 可以通过类型约束自动推断出 T 是 number。

现在,addNum 函数只接受数字类型,并且可以安全地使用 + 运算符来递增它。如果你尝试传递一个非数字类型的参数给 addNum,TypeScript 编译器将会报错,这正是我们想要的类型安全行为。

logo
Microsoft
子站问答
访问
宣传栏