【发布时间】:2021-05-03 21:34:52
【问题描述】:
我正在尝试找到一种使用泛型对递归(最后返回一个数字)进行类型安全的方法。
我尝试了什么:
function recursion<N,T>(value:N, lim:N):T|N {
if(value < lim) return recursion<N, T>(value+1,lim);
return value;
}
recursion<number, Function>(0,10);
尽管传递了 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);
我认为只要我在泛型上传递了number 类型,就可以进行操作,但似乎并非如此。为什么会这样?是否有任何可能的解决方法?
尝试过(不起作用):
return recursion<number, Function>(value+1,lim)
日志:
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);
【问题讨论】:
-
你需要
function recursion<N extends number>(value: N, lim: N): N告诉 TypeScriptN永远是一个数字。该函数在其定义处进行类型检查,而不是在每个调用站点 - 它不是模板而是通用的。你的第二个类型参数T也是没用的。
标签: typescript recursion functional-programming typescript-generics union-types