TypeScript集合映射构造函数的快捷方式?Java开发者技术问询
在TypeScript中实现类似Java构造函数引用的集合转换
嘿,作为同时写过Java和TypeScript的开发者,我太懂你想要这种简洁语法的心情了!先直接说结论:TypeScript里没有和Java Response::new 完全一样的方法引用语法,但我们有两种方式可以达到类似的简洁效果,而且能解决你当前的参数问题。
为什么你的Rule::new写法不生效?
首先得搞清楚原因:你的Rule构造函数需要两个参数——service和ruleResponse,但Array.map()的回调函数默认只会把数组的当前元素和索引作为参数传入。如果直接写map(Rule),TypeScript会把ruleResponse传给构造函数的第一个参数(也就是你需要的service位置),索引传给第二个参数,这完全不符合你的需求;另外TS本身也不支持::这种Java风格的方法引用符号。
解决方案1:用Function.bind()绑定固定参数
如果你想接近Java方法引用的写法,可以用bind()来预先绑定service这个固定参数:
return response.data.jobAllocationRules.map(Rule.bind(null, service));
这里bind(null, service)的作用是:
- 第一个参数
null是构造函数的this指向(因为构造函数调用时this会自动指向新实例,所以传null不影响) - 后面的
service会作为构造函数的第一个参数传入,而map提供的ruleResponse会自动成为第二个参数,刚好匹配new Rule(service, ruleResponse)的参数顺序。
解决方案2:简化箭头函数写法
这也是TypeScript里最常用的简洁写法,把你原来的代码简化成一行:
return response.data.jobAllocationRules.map(rule => new Rule(service, rule));
去掉箭头函数里的大括号和return,语法更紧凑,可读性也很强,很多TS开发者都会优先用这种方式。
额外补充:单参数构造函数的情况
如果你的构造函数只有一个参数(比如只需要ruleResponse),那确实可以直接写map(Rule),比如:
// 假设Rule构造函数只有ruleResponse一个参数 return response.data.jobAllocationRules.map(Rule);
这时候map会把每个元素作为唯一参数传给Rule构造函数,效果和箭头函数完全一致。
内容的提问来源于stack exchange,提问作者Luke Xu
相关产品推荐
相关产品推荐

