如何禁止未修饰的类作为参数传入?

时间:2018-01-11 08:26:36

标签: typescript decorator

在TypeScript中,我定义了一个装饰器

function Foo(type: AnEnum) {
    return <T extends { pattern: RegExp, new(...args: any[]): {} }>(constructor: T) => {
        RegisterPattern(pattern) // defined elsewhere
        return class extends constructor {
            public type: AnEnum = type
        }
    }
}

并将其用作

@Token(AnEnum.Bar)
class Bar {
    public static pattern = /./
    public test: number
    constructor() {
        this.test = 1
    }
}

我希望只有用@Foo修饰的类传递给像

这样的函数
function func(decoratedObject: DecoratedType) {
    /* something */
}

和TypeScript应该识别出添加了一个名为type的附加字段。可能吗?或者这是一个糟糕的设计模式?

1 个答案:

答案 0 :(得分:2)

TypeScript目前不支持通过装饰器进行建模类型变异。

此功能已被请求,并在TypeScript/issues/4881

中进行了广泛讨论

要获得所需的效果,必须将装饰器作为函数调用并捕获结果值。

对于装饰者来说,这意味着写作:

const decorated = decorator(class {});

对于装饰工厂,这意味着写作:

const decorated = decorator(configuration)(class {});