主题
快速开始
欢迎使用函数库
快速开始
欢迎来到 2020 年代
函数库是您无法离开的下一个工具库。首先,它功能强大。通过这些强大的函数,您可以获得强类型支持和零依赖。如果您能稍微尝试一下这些函数,我相信您会爱上它。
特色函数
来,让我们先了解几个我们已经离不开的函数。希望它们对您也有用。
try
_.try
函数抽象了 try/catch 的逻辑分支,并提供了一个类似 "错误优先回调" 的响应。
ts
const [err, response] = await _.try(api.gods.create)({ name: 'Ra' })
if (err) {
throw new Error('您的神太弱了,无法被创建')
}
range
_.range
函数返回一个生成器,可用于迭代。这意味着您再也不需要编写 for (let i)
循环了——而且您也不应该这样做。
ts
for (const i of _.range(0, 4)) {
console.log(i) // 0, 1, 2, 3, 4
}
for (const i of _.range(10, 20, 2)) {
console.log(i) // 10, 12, 14, 16, 18, 20
}
select
_.select
函数接受一个映射函数和一个过滤函数,并在单次迭代中一起执行它们。您再也不需要因为需要映射和过滤而编写 reduce 了,而且您也不希望为了性能而分别实现它们。
ts
const superPoweredGodsFromEgypt = _.select(
gods,
g => ({ ...g, power: g.power * g.power }),
g => g.culture === 'egypt'
)
defer
_.defer
函数允许您在运行异步函数时注册要作为清理运行的函数。这类似于 try/finally,但您可以在特定时间注册 finally 块。
ts
await _.defer(async (defer) => {
await api.builds.updateStatus('in-progress')
defer((err) => {
api.builds.updateStatus(err ? 'failed' : 'success')
})
fs.mkdir('build')
defer(() => {
fs.unlink('build')
})
await build()
})
objectify
_.objectify
函数帮助您在一步中将列表转换为对象。通常,我们要么分两步完成,要么编写一个 reduce。
ts
const godsByCulture = _.objectify(gods, g => g.name, g => g.culture)
爱与恨
Lodash
Lodash 非常棒。当 JavaScript 还在成熟阶段时,它提供了在原生环境中不容易实现的功能。那是上个十年的事了。在这个十年,需求不同了。函数库的目标是提供您需要的强大函数,而不是运行时现在已经提供的函数,并以优秀的类型和易于阅读和理解的源代码实现这一点。
说不
函数库不提供 _.map
或 _.filter
函数。在可选链和空值合并操作符出现之前,它们很有用。现在,真的没有必要了。
在过去的十年中,整个 JavaScript 社区,特别是 TypeScript 社区,已经更接近一些关键价值观:确定性是好的,多态是坏的,强类型就是一切。Lodash 的魅力之一是它允许您向函数传递不同的类型,并根据类型获得不同的行为。例如 _.map
函数,它可以接受集合或对象并对其中任何一个进行映射。函数库不提供这种多态行为。
抱歉,但这是我的立场。