Typescript 仅针对特定属性类型的属性装饰器
我在TypeScript中有一个属性装饰器,它只能用于Typescript 仅针对特定属性类型的属性装饰器,typescript,decorator,Typescript,Decorator,我在TypeScript中有一个属性装饰器,它只能用于Array类型的属性。要强制执行此操作,如果属性类型不是Array(用于获取属性类型信息),则在运行时抛出TypeError: 但是,我不认为这太友好了。如何使TypeScript编译器只允许在具有特定类型的属性上使用特定属性装饰器?您得到的错误是由于缺少返回表达式 试着做一些类似的事情: export function Decorator(fn:any) { return (target: Object, propertyKey: st
Array
类型的属性。要强制执行此操作,如果属性类型不是Array
(用于获取属性类型信息),则在运行时抛出TypeError
:
但是,我不认为这太友好了。如何使TypeScript编译器只允许在具有特定类型的属性上使用特定属性装饰器?您得到的错误是由于缺少返回表达式 试着做一些类似的事情:
export function Decorator(fn:any) {
return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<Array>) => {
if (Reflect.getMetadata("design:type", target, propertyKey) !== Array) {
throw new TypeError();
}
return descriptor;
};
}
导出函数装饰器(fn:any){
返回(目标:对象,属性key:string,描述符:TypedPropertyDescriptor)=>{
if(Reflect.getMetadata(“design:type”、target、propertyKey)!==数组){
抛出新的TypeError();
}
返回描述符;
};
}
实现这一点有一个小技巧:
function ArrayLog<K extends string, C extends { [ A in K ]: Array<any> }>(target: C, key: K) {
/* ... */
}
函数ArrayLogI恐怕属性装饰程序不接受描述符
参数。至少我找不到关于它的任何文档,编译器也不允许我这样做:无法解析属性decorator的签名…
很抱歉,你是对的。这是一个方法修饰符。我不知道是否有一个解决方案的财产。也许你可以做一个getter而不是一个直接的属性。我知道你会遇到这个错误,不确定它是否相关,但是你能包含这个代码吗?@Alex一个具有以下签名的装饰器总是会产生这个问题,不管函数体是什么:(target:any,property:string | symbol)=>PropertyDescriptor
。将参数类型更改为兼容类型也无济于事,这里的问题是返回类型。这很奇怪,因为返回一个PropertyDescriptor应该是。
function ArrayLog<K extends string, C extends { [ A in K ]: Array<any> }>(target: C, key: K) {
/* ... */
}
function ArrayLog<K extends string, C extends Record<K, Array<any>>>(target: C, key: K) {
/* ... */
}