TypeScript 中是否有一种方法(可能是后处理器、转换器、反射 API 或注释系统)来获取类的属性和属性的类型,就像 Python 的
__annotations__
?
这就是我想要的代码:
class A {
public k: string;
public o: number;
public s: AnotherClass;
}
sometool(A); // And get something like:
{
k: String,
o: Number,
s: AnotherClass
}
正如 Wiktor Z. 在评论中提到的,typeconv 似乎是特定任务的一个不错的选择。
但如果你正在寻找更通用、有更多可能性的东西,反思就是正确的方向。不幸的是,TypeScript 本身不包含任何接近反射的东西,但一些聪明的人为 TS 创建了反射。您可以使用此存储库中提到的解决方案之一typescript 需要类型。
我是 TypeScript 运行时反射解决方案之一的作者。 这是适合您的用例的 Stackblitz 示例。
import { Type } from 'rttist';
import { Metadata } from './metadata.typelib';
printSchemas([
...Metadata.getTypes().filter((t) => t.module.id.includes('/models/Model')),
]);
function printSchemas(types: Type[]) {
for (let t of types) {
console.log(t.displayName);
if (!t.isObjectLike()) {
throw new Error(`Non-object type: ${t.displayName}`);
}
const schema = t.getProperties().reduce((obj, prop) => {
if (prop.name.isString()) {
obj[prop.name.name] = prop.type.isPrimitive()
? prop.type.name
: prop.type.id;
}
return obj;
}, {} as Record<string, string>);
console.table(schema);
}
}
输出
Interface IModelOne [@rttist-esbuild-demo/models/ModelOne:IModelOne]
┌─────────┬──────────┐
│ (index) │ Values │
├─────────┼──────────┤
│ foo │ 'String' │
│ bar │ 'Number' │
└─────────┴──────────┘
Class ModelThree [@rttist-esbuild-demo/models/ModelThree:ModelThree]
┌─────────┬─────────────────────────────────────────────────┐
│ (index) │ Values │
├─────────┼─────────────────────────────────────────────────┤
│ foo │ 'String' │
│ bar │ 'Number' │
│ baz │ '@rttist-esbuild-demo/models/ModelTwo:ModelTwo' │
└─────────┴─────────────────────────────────────────────────┘
Class ModelTwo [@rttist-esbuild-demo/models/ModelTwo:ModelTwo]
┌─────────┬───────────┐
│ (index) │ Values │
├─────────┼───────────┤
│ alfa │ 'Boolean' │
│ bravo │ '#Date' │
└─────────┴───────────┘