Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 仅针对特定属性类型的属性装饰器_Typescript_Decorator - Fatal编程技术网

Typescript 仅针对特定属性类型的属性装饰器

Typescript 仅针对特定属性类型的属性装饰器,typescript,decorator,Typescript,Decorator,我在TypeScript中有一个属性装饰器,它只能用于Array类型的属性。要强制执行此操作,如果属性类型不是Array(用于获取属性类型信息),则在运行时抛出TypeError: 但是,我不认为这太友好了。如何使TypeScript编译器只允许在具有特定类型的属性上使用特定属性装饰器?您得到的错误是由于缺少返回表达式 试着做一些类似的事情: export function Decorator(fn:any) { return (target: Object, propertyKey: st

我在TypeScript中有一个属性装饰器,它只能用于
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) {
    /* ... */
}