TypeScript 元数据操作 API 及示例
1. 配置环境
安装依赖
bash
npm install reflect-metadatatsconfig.json 配置
json
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"target": "ES6"
}
}2. 元数据操作 API
Reflect.defineMetadata(key, value, target, propertyKey?)Reflect.getMetadata(key, target, propertyKey?)Reflect.hasMetadata(key, target, propertyKey?)Reflect.getMetadataKeys(target, propertyKey?)
3. 内置元数据键
design:type:属性/方法的类型design:paramtypes:方法参数的类型design:returntype:方法返回值类型
4. 示例代码
示例 1:自定义装饰器
typescript
import "reflect-metadata";
function LogInfo(message: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
Reflect.defineMetadata("log-message", message, target, propertyKey);
};
}
class UserService {
@LogInfo("用户创建方法")
createUser(name: string, age: number) {
console.log("创建用户");
}
}
// 获取元数据
const message = Reflect.getMetadata("log-message", UserService.prototype, "createUser");
console.log(message); // "用户创建方法"示例 2:获取类型信息
typescript
import "reflect-metadata";
function ValidateMethod(target: any, methodName: string) {
const paramTypes = Reflect.getMetadata("design:paramtypes", target, methodName);
const returnType = Reflect.getMetadata("design:returntype", target, methodName);
console.log(`${methodName} 参数类型:`, paramTypes);
console.log(`${methodName} 返回类型:`, returnType);
}
class ProductService {
@ValidateMethod
getProduct(id: number): Product {
return {} as Product;
}
}示例 3:基于元数据的依赖注入
typescript
const INJECTED_KEY = Symbol("INJECTED");
function Injectable(token: symbol) {
return function (target: any) {
Reflect.defineMetadata(INJECTED_KEY, token, target);
};
}
function getInjected(token: symbol) {
// 获取所有被标记为可注入的类
// 并返回对应的实例
}