装饰器元数据
使用元数据 API 附加和读取元数据。
装饰器元数据 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
装饰器元数据 API
标准化装饰器包含内置的元数据通道。上下文对象会公开一个可供写入的 metadata 对象,而类随后会通过众所周知的 Symbol.metadata 键携带这些元数据。
context.metadata
每个装饰器上下文都会为正在定义的类共享同一个 metadata 对象。装饰器会向其中附加数据;它随后会成为该类的元数据。
function tag(label: string) {
return function (value: any, context: DecoratorContext) {
context.metadata[context.name] = label;
};
}通过 Symbol.metadata 读取
类定义完成后,收集到的元数据可通过 SomeClass[Symbol.metadata] 访问。
class User {
@tag("identifier") id = 0;
@tag("display") name = "";
}
const meta = (User as any)[Symbol.metadata];
console.log(meta); // { id: "identifier", name: "display" }为什么要共享对象
由于类上的所有装饰器都会写入同一个 metadata 对象,您可以将多个装饰器的信息累积到一条连贯的记录中,用于描述该类。
存储结构化元数据
元数据值可以具有任意结构。一种常见模式是保存一个以成员名称为键的嵌套记录。
function column(type: string) {
return function (value: any, context: ClassFieldDecoratorContext) {
const md = context.metadata as any;
md.columns ??= {};
md.columns[context.name] = { type };
};
}类级元数据
类装饰器也可以写入元数据,例如表名,以补充每个字段的列信息。
function entity(table: string) {
return function (value: Function, context: ClassDecoratorContext) {
(context.metadata as any).table = table;
};
}
@entity("users")
class UserEntity {
@column("serial") id = 0;
@column("text") name = "";
}元数据的继承
元数据对象会沿原型链连接:子类的元数据对象以父类元数据为其原型,因此除非被覆盖,否则可以访问继承的条目。
Symbol.metadata 填充实现
Symbol.metadata 是一个众所周知的符号。在缺少它的环境中,您需要分配一个填充实现,以便运行时能够附加收集到的对象。
(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");无需反射元数据库的元数据
此接口本身就是装饰器提案的一部分,因此不需要单独的反射元数据库。该库只与较早的实验性设计类型发出机制相关(下一课会介绍)。
实用的读取辅助函数
一个小型访问器可以集中处理从任意类读取元数据的逻辑;当不存在元数据时,它会返回一个空对象。
function getMeta(cls: any): Record<string, any> {
return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}为什么这很重要
元数据将装饰器从一次性的行为包装器转变为类的声明式描述。框架读取这种描述来构建对象关系映射框架、验证器和路由器,而无需使用运行时反射技巧。
快速检查
请确认您对元数据接口的理解。
回顾
装饰器元数据接口为每个装饰器提供了共享的 context.metadata 对象,并通过 Symbol.metadata 暴露在类上。装饰器可以在无需外部库的情况下累积结构化且可继承的元数据,从而实现声明式、适合框架使用的类描述。
常见问题解答
「装饰器元数据」课时是免费的吗?
是的 — 「装饰器元数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「装饰器元数据」这节课中我会学到什么?
使用元数据 API 附加和读取元数据。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「装饰器元数据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。