列出类的属性和类型

问题描述 投票:0回答:1

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
} 

node.js typescript reflection annotations
1个回答
0
投票

正如 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'  │
└─────────┴───────────┘
© www.soinside.com 2019 - 2024. All rights reserved.