运算符“+”不能应用于类型“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));
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 编译器将会报错,这正是我们想要的类型安全行为。
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));
如何为动态创建的函数声明泛型类型? 我如何在中使用并传递? < code>useFoo的预期用法
我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。
(沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢
我们给identity添加了类型变量。 帮助我们捕获用户传入的类型(比如:),之后我们就可以使用这个类型。 之后我们再次使用了当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。
本节开始介绍 TypeScript 一些进阶知识点,第一个要介绍的泛型是 TypeScript 中非常重要的一个概念,它是一种用以增强函数、类和接口能力的非常可靠的手段。 使用泛型,我们可以轻松地将那些输入重复的代码,构建为可复用的组件,这给予了开发者创造灵活、可重用代码的能力。 1. 慕课解释 泛型在传统的面向对象语言中极为常见,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。
我对打字稿非常兴奋。如何设置函数参数的类型? 我怎样才能更好地输入?我想指定它必须是一个接受数字并返回数字的函数。 然后我能为这种类型做一个“接口”或一些简写,这样我就能让我的高阶函数签名更具可读性吗?