【发布时间】:2017-06-29 12:49:50
【问题描述】:
我希望改进一些代码,我认为这些代码很好地代表了将类装饰器用作 Typescript 的 mixin this 问题正是我正在寻找的,但我开始使用“不可能”的解决方案黑客攻击。
结果就是这个工作代码
declare type Constructor<T = {}> = new(...args: any[]) => T
//Permissions function runs when @Permissions is placed as a class decorator
export function Permissions<TBase extends Constructor>(Base:TBase) {
return class extends Base {
read: boolean = false;
edit: boolean = false;
admin: boolean = false;
constructor(...args: any[]) {
super(...args);
this.read = false;
this.edit = false;
this.admin = false;
}
isRead(): boolean {
return this.read;
}
isEdit(): boolean {
return this.edit;
}
isAdmin(): boolean {
return this.admin;
}
setRead(value: boolean): void {
this.read = value;
}
setEdit(value: boolean): void {
this.edit = value;
}
setAdmin(value: boolean): void {
this.read = value
this.edit = value
this.admin = value
}
}
}
// Interface to provide TypeScript types to the object Object
export interface IPermissions {
read: boolean;
edit: boolean;
admin: boolean;
constructor(...args: any[]);
isRead(): boolean;
isEdit(): boolean;
isAdmin(): boolean
setRead(value: boolean): void
setEdit(value: boolean): void
setAdmin(value: boolean): void
}
//Extends the User Object with properties and methods for Permissions
interface User extends IPermissions {}
//Class Decorator
@Permissions
class User {
name: string;
constructor(name: string, ...args: any[]) {
this.name = name;
}
}
// Example instantiation.
let user = new User("Nic")
user.setAdmin(true);
console.log(user.name + ": has these Permissions; Read: " + user.isRead() + " Edit: " + user.isEdit() + " Admin: " + user.isAdmin())
我的问题与界面有关。我想从 Permissions 函数动态创建接口定义。所以我真正需要做的就是修改权限函数,以便在用户对象中获得正确的类型
有没有办法在 TypeScript 中做到这一点?
【问题讨论】:
标签: typescript decorator