强制执行必需步骤
在所有必需字段设置完成前,禁止调用 build()。
强制执行必需步骤 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
阻止过早调用 build()
现在,我们利用累积的状态来禁止在必需字段设置完成之前调用 build()。阻止不完整构建的是类型系统,而不是运行时检查。
定义最终结构
首先声明完整的对象,并指出哪些键是必需的。只有当状态包含所有必需键时,构建器才会允许调用 build()。
interface Config {
url: string; // required
method: string; // required
timeout?: number; // optional
}
type Required = { url: string; method: string };条件式 build 签名
只有当累积状态 S 扩展了必需键时,我们才提供 build。条件类型会返回真正的方法,或者返回一个不可用的方法。
class Builder<S> {
build(this: Builder<Required>): Config {
return this.d as Config;
}
private d: Record<string, unknown> = {};
}使用 this 参数
this: Builder<Required> 参数限制了哪些构建器实例可以调用 build。如果 S 不满足 Required,该调用就会产生类型错误。
// Only a Builder whose S includes url and method
// can legally invoke build().将设置方法连接到状态
每个设置方法都会像之前一样扩展 S。两个必需的设置方法都运行后,S 最终会扩展 Required,此时便可以调用 build。
class Builder<S> {
private d: Record<string, unknown> = {};
url(u: string): Builder<S & { url: string }> { this.d.url = u; return this as any; }
method(m: string): Builder<S & { method: string }> { this.d.method = m; return this as any; }
build(this: Builder<{ url: string; method: string }>): Config { return this.d as Config; }
}顺利路径可以通过编译
当两个必需步骤都存在时,链式调用能够通过类型检查并运行。编译器可以确认 S 包含每个必需键。
const cfg = new Builder<{}>().url("/x").method("GET").build();
console.log(cfg.url, cfg.method);缺少步骤时会失败
省略一个必需步骤后,build() 将无法通过类型检查,因为构建器的 S 没有扩展 Required。这个错误会在编译时被捕获。
// const bad = new Builder<{}>().url("/x").build();
// Error: 'build' can only be called when method is set too.为什么这优于运行时保护
运行时的 if (!this.url) throw 只有在代码运行时才会失败。使用 this 参数的方法会在类型检查期间失败,因此不完整的构建永远不会被发布。
可选字段仍然是可选的
像 timeout 这样的可选步骤从不属于 Required,因此不会限制 build()。您可以自由地包含或跳过它们。
const ok = new Builder<{}>().method("PUT").url("/y").build();
console.log("order of required steps does not matter");扩展到众多要求
将更多必需键添加到 Required 结构和 this 参数中,编译器就会对它们全部进行强制检查。这种模式可以扩展到任意数量的必需步骤。
限制
这一保证依赖于在每个设置方法中如实传递 S,并使用 this 参数进行类型检查。类型断言必须限制在设置方法内部,以便调用方始终享有完整的类型安全。
快速检查
快速检查本课内容。
回顾
要强制执行必需步骤,请使用 this: Builder<Required> 参数为 build 设置类型。只有当累积状态 S 包含每个必需键时,该方法才能通过类型检查,从而将不完整的构造转化为编译错误。
常见问题解答
「强制执行必需步骤」课时是免费的吗?
是的 — 「强制执行必需步骤」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「强制执行必需步骤」这节课中我会学到什么?
在所有必需字段设置完成前,禁止调用 build()。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「强制执行必需步骤」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。