Параметры функции Typescript Arrow с декораторами - PullRequest
0 голосов
/ 10 октября 2018

Возможно ли в настоящее время использовать декораторы для параметров в функции стрелки?Например:

const func: Function = (@Decorator param: any) => { ... }

или

class SomeClass {
  public classProp: Function = (@Decorator param: any) => { ... }
}

WebStorm это не нравится, компилятору это не нравится и он не может найти в сети документацию, которая намекает на это или нетявляется допустимым Typescript.

Моя конкретная проблема заключается в использовании его внутри класса в качестве свойства, но, похоже, эта проблема распространяется и на стандартные объявления переменных.

Если это недопустимо,Есть ли планы разрешить это?

1 Ответ

0 голосов
/ 10 октября 2018

В машинописной документации, если я вас правильно понял, вы найдете ответ здесь: https://www.typescriptlang.org/docs/handbook/decorators.html

Чтобы процитировать соответствующую часть:

import "reflect-metadata";

const requiredMetadataKey = Symbol("required");

function required(target: Object, propertyKey: string | symbol, parameterIndex: number) {
    let existingRequiredParameters: number[] = Reflect.getOwnMetadata(requiredMetadataKey, target, propertyKey) || [];
    existingRequiredParameters.push(parameterIndex);
    Reflect.defineMetadata(requiredMetadataKey, existingRequiredParameters, target, propertyKey);
}

function validate(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<Function>) {
    let method = descriptor.value;
    descriptor.value = function () {
        let requiredParameters: number[] = Reflect.getOwnMetadata(requiredMetadataKey, target, propertyName);
        if (requiredParameters) {
            for (let parameterIndex of requiredParameters) {
                if (parameterIndex >= arguments.length || arguments[parameterIndex] === undefined) {
                    throw new Error("Missing required argument.");
                }
            }
        }

        return method.apply(this, arguments);
    }
}

А затем используйте ее как таковую

класс Greeter {приветствие: строка;

   constructor(message: string) {
       this.greeting = message;
   }

   @validate
   greet(@required name: string) {
       return "Hello " + name + ", " + this.greeting;
   }

}

Надеюсь, это поможет;)

Seb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...