# 快速开始

URL: https://caijiao.org/radash/getting-started
Source: docs/radash/getting-started.md
Description: 欢迎使用函数库 函数库是您无法离开的下一个工具库

欢迎使用函数库


## 快速开始

### 欢迎来到 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` 函数，它可以接受集合或对象并对其中任何一个进行映射。函数库不提供这种多态行为。

抱歉，但这是我的立场。
