Typescript 通过泛型实现类型安全递归?
我正试图找到一种使用泛型对递归(在结尾返回一个数字)进行类型安全保护的方法 我尝试的是: 函数递归(值:N,lim:N):T | N{ if(值Typescript 通过泛型实现类型安全递归?,typescript,recursion,functional-programming,typescript-generics,union-types,Typescript,Recursion,Functional Programming,Typescript Generics,Union Types,我正试图找到一种使用泛型对递归(在结尾返回一个数字)进行类型安全保护的方法 我尝试的是: 函数递归(值:N,lim:N):T | N{ if(值
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
来告诉TypeScriptN
将始终是一个数字。函数在其定义上进行类型检查,而不是在每个调用站点上进行类型检查-它不是模板,而是泛型。另外,您的第二个类型参数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);