我在TypeScript中有一个属性修饰器,它只能用于Array
类型的属性。要强制执行此操作,如果属性类型不是TypeError
(使用reflect metadata获取属性类型信息),则会在运行时抛出Array
:
function ArrayLog(target: any, propertyKey: string) {
if (Reflect.getMetadata("design:type", target, propertyKey) !== Array) {
throw new TypeError();
}
// ...
}
但是,我不会认为这太开心了。我怎么能这样做,以便TypeScript编译器允许在某种类型的属性上使用某个属性装饰器 ?
答案 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) {
/* ... */
}
不幸的是,这仅适用于公共财产,不适用于私有或受保护财产...