0Pricing
TypeScript Academy · 课时

类型安全的服务令牌

使用带类型的令牌,避免运行时解析错误。

类型安全的服务令牌 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

字符串令牌问题

像 "Logger" 这样的字符串令牌很容易拼写错误,而且不携带类型信息。容器无法告诉您 get("Loggr") 是错误的,而解析出的类型通常是 any。

将符号用作令牌

使用符号而不是字符串,可以为每个令牌提供唯一标识,避免意外与其他令牌发生冲突。通过一个集中式注册表可以统一管理这些令牌。

const TYPES = {
  Logger: Symbol.for("Logger"),
  Mailer: Symbol.for("Mailer"),
} as const;

将令牌映射到类型

更深层的目标是将每个令牌与它所解析出的类型关联起来,让容器返回正确的类型,而不是 any。为此,我们会构建一个类型化令牌包装器。

interface Token<T> {
  readonly id: symbol;
  readonly _type?: T; // phantom type marker
}

创建类型化令牌

辅助函数会生成一个令牌,并通过幻影字段记住它的类型。该字段从不存储值,只为编译器携带类型信息。

function token<T>(name: string): Token<T> {
  return { id: Symbol.for(name) };
}
const LoggerToken = token<Logger>("Logger");

类型化容器接口

我们对容器进行类型化,使 get 能够根据令牌推断解析出的类型。不需要类型断言,也不需要 any。

interface TypedContainer {
  get<T>(t: Token<T>): T;
  bind<T>(t: Token<T>, impl: () => T): void;
}

使用推断类型进行绑定

进行绑定时,工厂函数的返回类型必须与令牌的类型匹配。类型不匹配会在编译时被捕获。

declare const c: TypedContainer;
c.bind(LoggerToken, () => new ConsoleLogger());
// ConsoleLogger must satisfy Logger or this errors.

使用完整类型进行解析

现在,get 会准确返回令牌的类型。无需手动添加类型注解,自动补全和类型检查也能作用于结果。

const logger = c.get(LoggerToken); // type: Logger
logger.log("typed resolution");

避免查找错误

由于令牌是带类型的值,拼写错误会引用未定义的变量(从而产生编译错误),而不会静默地使用错误的字符串。整类字符串键错误都会消失。

// c.get(LogerToken) -> compile error: LogerToken is not defined

InversifyJS 对应方案

InversifyJS 也支持符号令牌,社区辅助工具还提供了类型化包装器。其原则完全相同:将类型化令牌绑定到实现,并使用正确的类型进行解析。

import { Container } from "inversify";
const TYPES = { Logger: Symbol.for("Logger") };
// container.bind<Logger>(TYPES.Logger).to(ConsoleLogger)

令牌注册表

将令牌集中放在一个模块中,可以建立唯一事实来源,便于在整个代码库中发现、重构并保持一致。

export const TOKENS = {
  Logger: token<Logger>("Logger"),
  Mailer: token<Mailer>("Mailer"),
};

优点总结

类型化令牌提供了唯一标识(符号)、编译时安全性(拒绝类型不匹配)、正确的解析类型(不使用 any)以及拼写错误保护(未定义变量错误)。

快速检查

快速检查本课内容。

回顾

类型安全的服务令牌会用幻影类型包装唯一的 symbol,将每个令牌映射到它所解析出的类型。get 会返回精确类型,绑定会强制实现相匹配,而拼写错误会变成编译错误,不再是静默的字符串查找错误。

常见问题解答

「类型安全的服务令牌」课时是免费的吗?

是的 — 「类型安全的服务令牌」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「类型安全的服务令牌」这节课中我会学到什么?

使用带类型的令牌,避免运行时解析错误。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「类型安全的服务令牌」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 控制反转基础
  2. 构造函数注入
  3. 使用 InversifyJS 的 DI 容器
  4. 类型安全的服务令牌
← 返回 TypeScript Academy