Typescript 通过泛型实现类型安全递归?

Typescript 通过泛型实现类型安全递归?,typescript,recursion,functional-programming,typescript-generics,union-types,Typescript,Recursion,Functional Programming,Typescript Generics,Union Types,我正试图找到一种使用泛型对递归(在结尾返回一个数字)进行类型安全保护的方法 我尝试的是: 函数递归(值:N,lim:N):T | N{ if(值

我正试图找到一种使用泛型对递归(在结尾返回一个数字)进行类型安全保护的方法

我尝试的是:

函数递归(值:N,lim:N):T | N{ if(值 尽管传递了type
number
,Typescript还是决定给我一个错误:

TSError: ⨯ Unable to compile TypeScript:
src/main.ts:2:41 - error TS2365: Operator '+' cannot be applied to types 'N' and 'number'.

2  if(value < lim) return recursion<N, T>(value+1,lim);
日志:

src/main.ts:2:53-错误TS2365:运算符“+”不能应用于类型“N”和“number”。
2如果(值
为什么呢

递归
采用两个泛型,它们可能有也可能没有定义
+
运算符。看到这个签名,您似乎可以将
作为任何对象(如对象)传递给参数。如果Typescript允许,它将不会导致预期的行为

另外,您知道在您的情况下,您(最终)返回的是值的类型。所以,
T
我们知道,它是
N
类型,因为这就是递归的终止条件

如何修复它

//1。确保值具有兼容的类型
函数递归(值:N,lim:N):N{
if(值

  • 我们需要确保操作员处理类型。我们正在应用
    您需要
    函数递归(value:N,lim:N):N
    来告诉TypeScript
    N
    将始终是一个数字。函数在其定义上进行类型检查,而不是在每个调用站点上进行类型检查-它不是模板,而是泛型。另外,您的第二个类型参数
    T
    也没用。明白了!非常感谢,我甚至没有意识到用常规方法是可能的。我这样做的前提是,如果不将递归类型化为函数,就无法返回它。
    src/main.ts:2:53 - error TS2365: Operator '+' cannot be applied to types 'N' and 'number'.
    
    2  if(value < lim) return recursion<number, Function>(value+1,lim);
                                                          ~~~~~~~
    src/main.ts:2:61 - error TS2345: Argument of type 'N' is not assignable to parameter of type 'number'.
    
    2  if(value < lim) return recursion<number, Function>(value+1,lim);