属性装饰器仅适用于特定属性类型

时间:2016-04-13 16:28:40

标签: typescript decorator

我在TypeScript中有一个属性修饰器,它只能用于Array类型的属性。要强制执行此操作,如果属性类型不是TypeError(使用reflect metadata获取属性类型信息),则会在运行时抛出Array

function ArrayLog(target: any, propertyKey: string) {
    if (Reflect.getMetadata("design:type", target, propertyKey) !== Array) {
        throw new TypeError();
    }

    // ...
}

但是,我不会认为这太开心了。我怎么能这样做,以便TypeScript编译器允许在某种类型的属性上使用某个属性装饰器

1 个答案:

答案 0 :(得分:1)

有一个小技巧可以实现:

function ArrayLog<K extends string, C extends { [ A in K ]: Array<any> }>(target: C, key: K) {
    /* ... */
}

甚至更好(仅在https://stackoverflow.com/a/47425850/274473中找到):

function ArrayLog<K extends string, C extends Record<K, Array<any>>>(target: C, key: K) {
    /* ... */
}

不幸的是,这仅适用于公共财产,不适用于私有或受保护财产...