什么是类型级 DSL
使用类型将流式 API 限制为有效程序。
什么是类型级 DSL 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
什么是类型层面的 DSL
类型层面的DSL(领域特定语言)使用 TypeScript 类型来约束接口,使得只有有效程序才能通过编译。这些类型充当语法:无效组合会在代码运行前被拒绝。
嵌入式 DSL
嵌入式 DSL 存在于宿主语言(此处为 TypeScript)内部,而不是使用单独的解析器。您编写普通的 TS,但类型系统会强制执行 DSL 规则。
熟悉的示例
您已经使用过类型层面的 DSL:例如只允许有效列名的查询构建器,或能从路径推断参数的路由器。这些类型编码了接口允许执行的操作。
约束流式接口
核心思想是:每个方法都会返回一种类型,限制您接下来可以调用的方法。以错误顺序调用方法会导致编译失败。
interface Empty { from(t: string): HasFrom; }
interface HasFrom { where(c: string): HasFrom; select(): string; }
declare const q: Empty;
q.from("users").select(); // ok
q.select(); // Error: select not on Empty类型中的状态机
这种模式就是类型层面的状态机:每个接口是一种状态,每个方法都是向另一种状态的转换。当您连续调用方法时,编译器会沿着这台状态机运行。
为什么不只进行运行时检查
运行时检查会在很晚的时候、在生产环境中、用户已经在使用时才失败。类型层面的 DSL 会提前在编辑器中失败,并在代码发布前显示红色波浪线。规则相同,但反馈成本低得多。
幽灵类型参数
DSL 经常通过幽灵类型参数携带信息:这些泛型只在编译时存在,用于跟踪累积的状态(已选择的列、已绑定的变量),不会产生运行时开销。
interface Query<Selected extends string> {
select<C extends string>(c: C): Query<Selected | C>;
}作为令牌的字面量类型
字符串字面量类型充当 DSL 令牌。它们与模板字面量和联合类型结合后,可以让类型系统分析 DSL 的文本内容。
type Direction = "asc" | "desc";
declare function orderBy(col: string, dir: Direction): void;
orderBy("age", "asc"); // ok
orderBy("age", "up"); // Error: not a Direction构建模块
类型层面的 DSL 组合使用:用于表示状态的泛型、用于分支的条件类型、用于解析字符串的模板字面量,以及用于转换结构的映射类型。后续课程会分别使用这些构建模块。
权衡
类型层面的 DSL 可以提供强有力的保证,但过度使用时可能产生晦涩的错误,并使编译速度变慢。优秀的 DSL 会在安全性和易读的错误消息之间取得平衡(后续课程会处理这一点)。
为何重要
将领域规则编码到类型中,意味着编译器会成为领域专家:它可以自动拒绝无意义的内容。这正是查询构建器、表单库和效果系统能够提供如此强保证的原因。
快速检查
测试您对类型层面 DSL 的理解。
回顾
类型层面的 DSL 使用 TypeScript 类型作为语法,因此只有有效程序才能通过编译。流式接口将状态机建模为每个方法都返回限制状态的类型,并使用幽灵泛型、字面量类型令牌、条件类型、模板字面量类型和映射类型作为构建模块,从而在编辑器中尽早提供反馈。
用 AI 导师学习 TypeScript — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 101
- 课程
- 352
常见问题解答
「什么是类型级 DSL」课时是免费的吗?
是的 — 「什么是类型级 DSL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「什么是类型级 DSL」这节课中我会学到什么?
使用类型将流式 API 限制为有效程序。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「什么是类型级 DSL」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 什么是类型级 DSL
- 设计流式查询 DSL
- 编译时输入验证
- 类型级 DSL 中的错误消息