0Pricing
TypeScript Academy · 课时

强制执行必需步骤

在所有必需字段设置完成前,禁止调用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 构建器模式基础
  2. 带类型的流式接口
  3. 强制执行必需步骤
  4. 不可变构建器
← 返回 TypeScript Academy