TypeScript(或某些库)是否有办法从func((x) => x.y())到'func(_.y())?

  • 本文关键字:func 是否 TypeScript typescript
  • 更新时间 :
  • 英文 :


一个简单的例子:

const strings = ['dog', 'cat', 'elephant'];
const stringLengths = strings.map((s) => s.length)

我想写的是:

const strings = ['dog', 'cat', 'elephant'];
const stringLengths = strings.map(_.length)

(Scala支持这样的结构)

我想知道是否有人实现了这样的东西?我尝试了代理类的一种方法,我可能会让它工作,但我不能让它接近类型安全。

Lodash允许直接指定属性以方便_.map(strings, "length")

const strings = ['dog', 'cat', 'elephant'];
const result = _.map(strings, "length");
console.log( result );
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

该字符串是_.property()的简写,也可以单独用于常规的.map()调用:

const strings = ['dog', 'cat', 'elephant'];
const result = strings.map(_.property("length"));
console.log( result );
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

对于调用方法,而不仅仅是提取属性,使用_method():

const strings = ['dog', 'cat', 'elephant'];
//without arguments
const shout = _.method("toUpperCase");
//with arguments
const shorten = _.method("slice", 1, 7);
console.log( strings.map(shout) );
console.log( strings.map(shorten) );
.as-console-wrapper { max-height: 100% !important}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

请参阅Lodash FP,它是Lodash的一个更函数式编程友好的版本,其中所有函数都是自动curry的,并将数据放在最后,以更容易地实现组合和重用:

const extractLength = _.map("length");
const strings = ['dog', 'cat', 'elephant'];
console.log( extractLength(strings) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/0.10.4/lodash-fp.min.js"></script>


要在TypeScript中使用Lodash,请安装DefinitelyTyped项目中的类型:

npm install --save-dev @types/lodash

Ramda

Ramda与Lodash具有相同的优势,因为它提供了通用实用程序。它更倾向于函数式编程,所有的实用程序都已经实现了柯里化,并支持函数结构,如Functors。

Ramda有几种方法来处理这些。

使用R.prop()

const strings = ['dog', 'cat', 'elephant'];
const result = strings.map(R.prop("length"));
console.log( result );
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>

使用透镜-透镜是可组合的getter和setter。在这个简单的例子中,R.prop()更方便,但对于更复杂的结构和查看内容的规则,镜头可能更合适。用法如下:

const strings = ['dog', 'cat', 'elephant'];
const result = strings.map(R.view(R.lensProp("length")));
console.log( result );
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>

对于调用方法,Ramda提供了一个与Lodash的_.method()直接比较的R.invoker():

const strings = ['dog', 'cat', 'elephant'];
//without arguments
const shout = R.invoker(0, "toUpperCase");
//with arguments
const shorten = R.invoker(2, "slice")(1, 7);
console.log( strings.map(shout) );
console.log( strings.map(shorten) );
.as-console-wrapper { max-height: 100% !important}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>


与Lodash类似,要在TypeScript中使用Ramda,请安装DefinitelyTyped项目中的类型

npm install --save-dev @types/ramda

相关内容

  • 没有找到相关文章

最新更新