Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Effect 魔法解锁 TypeScript 的函数式超能力!

使用 Effect 魔法解锁 TypeScript 的函数式超能力!

作者头像
萌萌哒草头将军
发布于 2025-05-12 02:55:50
发布于 2025-05-12 02:55:50
4400
代码可运行
举报
文章被收录于专栏:前端框架前端框架
运行总次数:0
代码可运行

前言

这个周末学习了一个新工具 Effect-TS ,打开我了写代码的新思路,现在迫不及待的分享给大家!

正文

Effect-TS 的核心是一个名为 Effect数据结构,它封装了副作用(例如网络请求、文件操作等),并提供了类型安全的操作方式。Effect 的几个关键特性包括:

  • 🔒 类型安全:通过 TypeScript 的类型推断,确保副作用的输入输出和错误类型明确!
  • 💻 流式(functional)编程风格:将多个操作符或函数按顺序组合起来,使代码更简洁、可读,并且符合函数式编程的理念。
  • 🚀 组合性:Effect 提供了丰富的组合操作符,类似 Lego 积木,让复杂逻辑变得简单。
  • 结构化并发:支持异步任务的取消和资源管理,避免内存泄漏。
  • 错误处理:将错误视为值,允许开发者以声明式的方式处理异常。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Produces a value of type number
         │  Fails with an Error
         │       │ Requires no dependencies
         ▼       ▼      ▼
Effect<number, Error, never>
安装与初始化

首先可以通过以下命令安装 Effect-TS 到你的项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pnpm add effect

Effect-TS 同时提供了一个命令行工具 create-effect-app,可以重新初始化一个新的项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pnpm create effect-app@latest

运行后,工具会引导你选择模板和配置 ESLint 等工具,生成一个预配置好的 Effect 项目!

初始化
初始化

初始化

第一个 Effect 程序
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Console, Effect } from "effect";
const main = Console.log("Hello, World!");
Effect.runSync(main);

这里 Console.log 是一个 Effect 操作,Effect.runSync 是同步执行 Effect 的方法。

流式编码风格

pipe 是 Effect 库中用于流式组合操作的核心工具,它通过线性化的方式将 Effect 的操作符和函数连接起来,使代码更简洁、可读且符合函数式编程风格。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Effect } from "effect";

const program = Effect.succeed(42).pipe(
  Effect.map((n) => n * 2),
  Effect.map((n) => n + 10)
);
// 运行后得到:Effect<never, never, 94>
// 解释:42 先被 map 乘以 2 得到 84,再被 map 加上 10 得到 94
丰富的操作符

操作符(Operator)是指一类用于处理、转换或组合数据流(在这里是 Effect 值)的函数或方法。这些操作符通常以声明式的方式操作 Effect 对象,帮助开发者以函数式编程风格管理副作用、异步流程或复杂逻辑。

除了上面提到的 map,还要很多类似数组的操作方法,flatMapzip等等!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Effect.succeed(10)
  .pipe(Effect.flatMap((n) => Effect.succeed(n + 5))); 
// 结果:Effect<never, never, 15>

通常,我们需要和 pip 配合,将多个操作符组合起来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Effect } from "effect";

const program = Effect.succeed(10).pipe(
  Effect.map((n) => n * 2),
  Effect.flatMap((n) => Effect.succeed(n + 5)),
  Effect.map((n) => `Result: ${n}`)
);
// 结果:Effect<never, never, "Result: 25">
结构化并发

Effect-TS 的结构化并发确保所有异步任务都能被正确管理。例如,运行多个并发请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Effect } from "effect";

const program = Effect.all([
  getTodo(1),
  getTodo(2),
  getTodo(3)
]).pipe(
  Effect.tap((todos) => Console.log(`Fetched todos: ${JSON.stringify(todos)}`))
);

Effect.runPromise(program);

Effect.all 并行执行多个 Effect,并在所有任务完成时返回结果。如果某个任务失败,Effect 会自动清理其他任务,避免资源泄漏。

处理异步操作

Effect-TS 特别擅长处理异步逻辑。假设我们要从一个 API 获取数据,可以这样实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Effect, HttpClient } from "effect";

const getTodo = (id: number) =>
  HttpClient.get(`/todos/${id}`).pipe(
    Effect.andThen((response) => response.json)
  );

const program = getTodo(1).pipe(
  Effect.tap((data) => Console.log(`Fetched todo: ${JSON.stringify(data)}`)),
  Effect.catchAll((error) => Console.log(`Error: ${error.message}`))
);

Effect.runPromise(program);

这段代码定义了一个 getTodo 函数,使用 HttpClient 发送 GET 请求。使用 pipe 组合操作,通过 Effect.andThen 解析 JSON 响应。使用 Effect.tap 打印结果,Effect.catchAll 捕获并处理错误。 最后通过 Effect.runPromise 异步执行程序。

错误重试与超时

Effect-TS 内置了强大的错误处理和重试机制。例如,我们可以为 API 请求添加重试和超时逻辑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Effect, Schedule } from "effect";

const robustGetTodo = (id: number) =>
  getTodo(id).pipe(
    Effect.retry(Schedule.exponential("100 millis", 2).pipe(Schedule.upTo(3))),
    Effect.timeout("1 second")
  );

const program = robustGetTodo(1).pipe(
  Effect.tap((data) => Console.log(`Success: ${JSON.stringify(data)}`)),
  Effect.catchAll((error) => Console.log(`Failed: ${error.message}`))
);

Effect.runPromise(program);

这里 Effect.retry 使用指数退避策略重试最多 3 次。Effect.timeout 设置 1 秒超时,超时后自动中止请求。所有这些操作都是声明式的,代码清晰且易于维护。

相较于 VueUse 或 ahooks 返回的错误类型通常是 unknown 或泛型,需要我们手动处理类型断言或错误边界!

最后

Effect-TS 不仅仅是一个核心库,它还有丰富的生态系统。感兴趣的小伙伴可以看这里

https://github.com/Effect-TS/effect?tab=readme-ov-file#monorepo-structure

生态
生态

生态

文章有限,我介绍了九牛一毛,感兴趣的同学可以看看文档:https://effect.website/docs

今天的分享就这些了,感谢大家的阅读,如果文章中存在错误的地方欢迎指正!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萌萌哒草头将军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于 HBase & Phoenix 构建实时数仓(5)—— 用 Kafka Connect 做实时数据同步
本篇演示安装配置 Kafka connect 插件实现 MySQL 到 Hbase 的实时数据同步。依赖环境见本专栏前面文章。相关软件版本如下:
用户1148526
2024/03/21
6240
基于 HBase & Phoenix 构建实时数仓(5)—— 用 Kafka Connect 做实时数据同步
从 MySQL 到 ClickHouse 实时数据同步 —— MaterializeMySQL + Materialized View
本篇演示使用 ClickHouse 的 MaterializeMySQL 数据库引擎和物化视图,实时将 MySQL 库表中的数据同步到 ClickHouse 的库表中。相关软件版本如下:
用户1148526
2024/04/20
4.2K0
从 MySQL 到 ClickHouse 实时数据同步 —— MaterializeMySQL + Materialized View
ClickHouse 集群部署(不需要 Zookeeper)
(1)安装 ClickHouse Server 和 ClickHouse Client
用户1148526
2024/04/18
9K2
大数据Flink进阶(九):集群基础环境搭建
Flink可以运行在所有类unix环境中,例如:Linux,Mac OS 和Windows,一般企业中使用Flink基于的都是Linux环境,后期我们进行Flink搭建和其他框架整合也是基于linux环境,使用的是Centos7.6版本,JDK使用JDK8版本(Hive版本不支持JDK11,所以这里选择JDK8),本小节主要针对Flink集群使用到的基础环境进行配置,不再从零搭建Centos系统,另外对后续整合使用到的技术框架也一并进行搭建,如果你目前已经有对应的基础环境,可以忽略本小节,Linux及各个搭建组件使用版本如下表所示。
Lansonli
2023/03/30
1.3K0
大数据Flink进阶(九):集群基础环境搭建
数据同步工具之FlinkCDC/Canal/Debezium对比
数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术,随着国产化的需求,我们也逐步考虑基于开源产品进行准实时数据同步工具的相关开发,逐步实现对商业产品的替代。本文把市面上常见的几种开源产品,Canal、Debezium、Flink CDC 从原理和适用做了对比,供大家参考。
王知无-import_bigdata
2021/10/27
14.2K0
基于 HBase & Phoenix 构建实时数仓(4)—— Kafka 集群安装部署
Kafka 是一个完整的消息系统,常用于实时系统中的消息中转和数据持久化。Kafka 集群安装部署依赖于 Zookeeper,本专栏前面文章介绍了 Zookeeper 安装部署及运行,参见 “安装部署 Zookeeper 集群”。本篇继续介绍在相同主机环境下安装部署 Kafka 集群。
用户1148526
2024/03/12
2590
替代ELK:ClickHouse+Kafka+FlieBeat
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
6990
替代ELK:ClickHouse+Kafka+FlieBeat
基于 HBase & Phoenix 构建实时数仓(3)—— Phoenix 安装
继续上一篇,本篇介绍在同一环境中安装 Phoenix,并连接上篇部署的 HBase 集群。
用户1148526
2024/03/09
5660
基于 HBase & Phoenix 构建实时数仓(2)—— HBase 完全分布式安装
完全分布式 HBase 集群的运行依赖于 Zookeeper 和 Hadoop,在前一篇中已经详细介绍了他们的安装部署及运行,参见“基于 HBase & Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署”。本篇继续介绍在相同主机环境下安装配置完全分布式 HBase 集群。
用户1148526
2024/03/09
4650
基于 HBase & Phoenix 构建实时数仓(2)—— HBase 完全分布式安装
湖仓一体电商项目(三):3万字带你从头开始搭建12个大数据项目基础组件
​上篇已经大概讲述大数据组件版本和集群矩阵配置说明,有不清楚的同学,可以阅读上一篇
Lansonli
2022/07/31
1.4K0
湖仓一体电商项目(三):3万字带你从头开始搭建12个大数据项目基础组件
基于 Kafka 与 Debezium 构建实时数据同步
在进行架构转型与分库分表之前,我们一直采用非常典型的单体应用架构:主服务是一个 Java WebApp,使用 Nginx 并选择 Session Sticky 分发策略做负载均衡和会话保持;背后是一个 MySQL 主实例,接了若干 Slave 做读写分离。在整个转型开始之前,我们就知道这会是一块难啃的硬骨头:我们要在全线业务飞速地扩张迭代的同时完成架构转型,因为这是实实在在的”给高速行驶的汽车换轮胎”。
PHP开发工程师
2021/05/08
2.7K0
基于 Kafka 与 Debezium 构建实时数据同步
Mysql实时数据变更事件捕获kafka confluent之debezium
如果你的后端应用数据存储使用的MySQL,项目中如果有这样的业务场景你会怎么做呢?
XING辋
2019/03/26
3.6K0
Mysql实时数据变更事件捕获kafka confluent之debezium
Flume+Kafka+Storm+Hbase+HDSF+Poi整合
举例:这个网站www.hongten.com(当然这是一个我虚拟的电商网站),用户在这个网站里面可以有很多行为,比如注册,登录,查看,点击,双击,购买东西,加入购物车,添加记录,修改记录,删除记录,评论,登出等一系列我们熟悉的操作。这些操作都被记录在日志信息里面。我们要对日志信息进行分析。
Hongten
2018/12/28
7250
大数据ClickHouse(十四):Integration系列表引擎
ClickHouse提供了许多与外部系统集成的方法,包括一些表引擎。这些表引擎与其他类型的表引擎类似,可以用于将外部数据导入到ClickHouse中,或者在ClickHouse中直接操作外部数据源。
Lansonli
2022/08/30
7360
大数据ClickHouse(十四):Integration系列表引擎
基于MongoDB的实时数仓实现
目前公司离线数仓现状,数仓部门每日凌晨后处理昨天的线上业务数据,因此第二天业务人员才看到的报表,数据是T-1的,因此数据是具有滞后性,尤其在互联网金融公司,有业务人员需要做信贷的风险管控,及时的调整一些风控规则和策略,但是不能立刻看到效果,而是需要等到第二天才可以看到调整的效果,因此才有了实时数仓的需求。线上业务数据基本存储在Mysql和MongoDB数据库中,因此实时数仓会基于这两个工作流实现,本文重点讲述基于MongoDB实现实时数仓的架构。
宇宙无敌暴龙战士之心悦大王
2023/03/14
5.6K0
Spark Streaming + Canal + Kafka打造Mysql增量数据实时进行监测分析
Spark中的Spark Streaming可以用于实时流项目的开发,实时流项目的数据源除了可以来源于日志、文件、网络端口等,常常也有这种需求,那就是实时分析处理MySQL中的增量数据。
王知无-import_bigdata
2021/04/21
1.6K0
Spark Streaming + Canal + Kafka打造Mysql增量数据实时进行监测分析
Debezium kafka connector 运行报错1236
今天发现stag环境kafka connector运行报错( curl 172.18.1.1:8083/connectors/order-center-connector/status)
XING辋
2019/07/19
2.2K0
kafka 连接器实现 Mysql 数据同步 Elasticsearch
Mysql 作为传统的关系型数据库,主要面向 OLTP,性能优异,支持事务,但是在一些全文检索,复杂查询上面并不快。Elasticsearch 底层基于 Lucense 实现,天然分布式,采用倒排索引存储数据,全文检索效率很高,使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。
Se7en258
2021/05/18
2.8K0
kafka 连接器实现 Mysql 数据同步 Elasticsearch
Debezium结合kafka connect实时捕获mysql变更事件写入elasticsearch实现搜索流程
本文将会实现一套完整的Debezium结合Kafka Connect实时捕获MySQL变更事件写入Elasticsearch并实现查询的流程.
XING辋
2019/03/26
7.5K4
Debezium结合kafka connect实时捕获mysql变更事件写入elasticsearch实现搜索流程
如何利用 Flink CDC 实现数据增量备份到 Clickhouse
首先什么是CDC ?它是Change Data Capture的缩写,即变更数据捕捉的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等操作。
麒思妙想
2021/07/19
4.7K0
推荐阅读
相关推荐
基于 HBase & Phoenix 构建实时数仓(5)—— 用 Kafka Connect 做实时数据同步
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验