Categories
Tags
Ai 生成 API学习 API简化 api请求 API调用 best-practices Blogging Caching catchTag catchTags class CLI Config context Context Context.Tag CSS Customization Demo development DocC dual API effect Effect Effect.Service Effect.succeed Example extension filterOrFail flatMap Fuwari gen generator grep hooks HTML HTTP响应 IDE自动补全 iOS javascript JavaScript Javascript Layer.effect Layer.provide Layers Linux Markdown Mock Next.js ParseError pipe pokemon PostCSS process.env progress Promise promise provideService PWA react React React Hook Form React Query React Router react-native Scheduler Schema Schema.Class security Service Worker Services SSR state-management suspense Tagged Errors TaggedError TanStack Query TanStack Start tips tryPromise tsconfig TypeScript typescript Video VS Code vscode Web API Web Development yield Zod 不透明类型 二叉树 代码组织 任务调度 优先级 使用服务 依赖注入 依赖管理 值语义 入门教程 最佳实践 最小堆 函数式编程 函数组合 前端 前端开发 副作用 副作用控制 可视化 可组合性 可维护性 可访问性 命令行 响应过滤 多个错误 实现 实践指南 层 层依赖 层组合 工具链 并发控制 应用架构 延迟执行 开发技巧 开发教程 开源 异步处理 异步操作 异步编程 性能优化 手写系列 排序 接口设计 插件开发 数据结构 数据获取 数据解码 数据验证 无限滚动 日历 日志分析 服务 服务依赖 服务定义 服务实现 服务提供 测试 源码分析 状态管理 环境变量 生成器 离线支持 程序分离 算法 类型安全 类型定义 类型推断 类型系统 类定义 线性代码 组合 翻译 自定义错误 表单验证 记忆化 设计模式 语义化 运维 运行时验证 部分应用 配置 配置变量 配置服务 配置管理 重构 错误处理 错误定义 错误恢复 项目设置
524 words
3 minutes
Effect 入门教程:3.Hello World 示例与基本概念
https://github.com/typeonce-dev/effect-getting-started-course
让我们回到 index.ts:
index.ts
import { Console, Effect } from "effect"; const main = Console.log("Hello world"); Effect.runSync(main);
这是 effect 的 “Hello World”,等价于 console.log。
我们已经可以注意到 effect 程序的第一个主要区别:在 effect 中,定义应用程序(main)和执行它(Effect.runSync)是两个独立的操作。
我们显式地执行,这意味着 effects 不会像 console.log 那样急切地运行!
/// 1️⃣ 定义 `main` 应用程序 const main = Console.log("Hello world"); /// 2️⃣ 执行应用程序 Effect.runSync(main);
为什么会这样?
Effect 是一系列操作的描述:
console.log执行某些副作用并返回voidConsole.log只是描述将要发生什么,而不执行任何副作用
/// 👇 `native` 是 `void`,副作用已经被执行了! /// 这个操作已经"做了"某些事情! const native: void = console.log("Hello world"); /// 👇 `effect` 是 `Effect<void>`,它描述了执行时返回 `void` 的东西 /// 这只是描述应该发生什么,它还没有做任何事情 const effect: Effect<void> = Console.log("Hello world");
Effect 本身不执行任何逻辑。相反,你需要显式地调用 run* 方法(在这个例子中是 runSync)。
这类似于存储一个函数而不是执行它:
/// 1️⃣ 定义 `main` 应用程序 const main = () => console.log("Hello World"); /// 2️⃣ 执行应用程序(显式地) main();
函数式副作用是不可变的数据结构,仅仅描述操作序列。
它们必须被显式运行才能执行真正的副作用。
Console.log 的工作原理
Console.log 是一个返回 Effect<void> 的函数。
在实践中,这意味着 Console.log 在执行时返回 void:
// 👇 定义 const main: Effect<void> = Console.log("Hello world"); // 👇 执行 Effect.runSync(main); // void
同样,这类似于一个执行时在控制台打印的函数:
type Program<T> = () => T; // 👇 定义 const main: Program<void> = () => console.log("Hello World"); // 👇 执行 main(); // void
Effect.runSync 接受一个 Effect 作为输入并同步地运行它。
结果:运行一个同步程序,打印字符串 "Hello World" 并返回 void:
- “运行一个同步程序…”:
Effect.runSync - ”…打印字符串
"Hello World"…”:Console.log("Hello World") - ”…并返回
void”:Effect<void>
index.ts
import { Console, Effect } from "effect"; const main = Console.log("Hello world"); Effect.runSync(main);
> effect-getting-started-course@1.0.0 dev > tsx src/index.ts Hello world
Effect 入门教程:3.Hello World 示例与基本概念
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/setting-up-the-project/effect-hello-world/