【问题标题】:typescript: Read class decorator files in node js打字稿:读取节点js中的类装饰器文件
【发布时间】:2018-11-19 23:43:29
【问题描述】:

我创建了一个类装饰器来读取角度组件的权限。

decorator.ts

function permissions(object: { [key: 'read' | 'write' | 'update' | 'delete']: string }[]) {
    return (ctor: Function) => {
        console.log(JSON.stringify(object));
    }
}

components.ts

// employee.component.ts
@permissions([{ read: 'read-unique-id' }])
@Component({
    selector: 'app-employee',
    templateUrl: './app-employee.component.html',
    styleUrls: ['./app-employee.component.css']
})
class Employee {
    constructor() { }
}

// employee-details.component.ts
@permissions([{ read: 'read-unique-id' }, { write: 'write-unique-id' }])
@Component({
    selector: 'app-employee-details',
    templateUrl: './app-employee-details.component.html',
    styleUrls: ['./app-employee-details.component.css']
})
class EmployeeDetails {
    constructor() { }
}

我应该通过在编译期间读取类名以及装饰器的权限详细信息来创建一个文件。只需一个命令即可生成以下文件。

示例:Permissions.ts

class Permissions {
    static EMPLOYEE_READ = 'read-unique-id';
    static EMPLOYEE_DETAILS_READ = 'read-unique-id';
    static EMPLOYEE_DETAILS_WRITE = 'write-unique-id';
}

我相信我应该创建一个 Node JS 应用程序来读取所有文件并检查 @permissions 装饰器并生成上述文件。对吗?

如果是这样,有人可以帮助我实现这一目标。阅读所有 component.ts 文件并获取权限详细信息,或者有没有其他方法可以实现。

更新:我应该通过 decoratorcomponent.ts 读取权限详细信息,并在 Node JS 的帮助下生成 Permissions.ts 应用程序。

【问题讨论】:

  • 我很困惑。你要读取哪个文件,要生成哪个文件?
  • 您可以使用正则表达式 (yikes)、github.com/mgechev/ngast、或 Angular 示意图、blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2 或任何 TypeScript AST。但目前还不清楚您希望从哪里获得像 EMPLOYEE_READ 这样的名称。无论如何,这似乎是一个类型不安全且容易出现拼写错误的环形交叉路口。
  • 对不起,我已经更新了我的帖子。希望现在很清楚。
  • 目前还不清楚 EMPLOYEE_DETAILS_READ 的来源。是否应该分析类名并从“EmployeeDetails”中获取“EMPLOYEE_DETAILS”部分?无论如何,上面的评论仍然适用。这可能是可能的,但解决方案会很笨拙、不可靠并且会出现不一致(可能有多个具有相同名称的类,或者具有相同权限的不同名称的类)。
  • EMPLOYEE_DETAILS_READ 将由类名 + 装饰器的键构成。即 EmployeeDetails + read => EmployeeDetails_READ.

标签: javascript node.js angular typescript decorator


【解决方案1】:

一种更简单且类型安全的方法是沿相反方向移动并使用一组常量而不是字符串,例如enum:

enum Permissions {
    EMPLOYEE_READ = 'read-unique-id';
    ...
}

...

@permissions([{ read: Permissions.EMPLOYEE_READ }, ...}])

包含常量的模块也可以在后端应用程序中重用。

【讨论】:

  • 权限会在前端定义,所以 FE 会从 permission.tsdecorator 和后端生成一个 JSON 文件将从 JSON 中读取并插入 DB。
  • 我不确定这种方法如何比拥有作为单一事实来源的权限常量更有益。后者可以在 FE 中使用类型检查,并且可以显式(例如通过迁移)或隐式(例如在服务器启动时)插入 DB。
  • 我以前使用过您建议的方法,但我在这里遇到的问题是每当创建新页面或组件时,都应该在枚举文件中更新权限。另外,我应该有一个映射表来将权限映射到组件。如果权限是使用装饰器定义的,则不需要映射文件。我以某种方式读取了具有定义权限的类名。
  • 是的,这就是通常的做法。太多的魔法会导致不一致,尤其是在大规模的情况下。另一种方法是使用数据库作为单一事实来源。它可以自动导出为 JSON,并且从 TS 2.9 开始正确键入 JSON 导入。
  • 我正在寻找大规模的解决方案。我觉得我所采取的方法将适合我的要求。类似于组件装饰器用来获取选择器、templateUrl 等。感谢您的支持。
猜你喜欢
  • 2020-01-02
  • 2016-12-05
  • 2021-09-30
  • 2021-05-22
  • 2017-04-02
  • 2019-03-25
  • 1970-01-01
  • 2018-02-12
  • 2020-12-24
相关资源
最近更新 更多