Могу ли я создать класс в Typescript, который реализует интерфейс, и в нем все еще могут быть декораторы? - PullRequest
1 голос
/ 16 апреля 2020

Могу ли я создать класс в Typescript, который реализует интерфейс, и на нем все еще могут быть декораторы?

У меня есть класс foo

@MyDecoratorA()
export default class Foo {
    @MyDecoratorB()
    public mySearchFunc(source: string, subString: string) {

        /*a lot of logic here*/
       return true;
    }
}

, и у меня есть мой интерфейс

  interface SearchFunc {
    (source: string, subString: string): boolean;
  }

Я могу создавать функции, реализующие myInterface, следующим образом:

let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
    let result = source.search(subString);
    return result > -1;
}

ссылка на машинопись

Я пытаюсь создать метод mySearchFun c класса 'Foo' реализует интерфейс "myInterface", но без потери декоратора

Мне понадобится этот декоратор в будущем.

1 Ответ

0 голосов
/ 16 апреля 2020

Вы можете заменить объявление метода mySearchFunc в классе Foo на объявление поля, где тип поля является интерфейсом, и назначить реализацию метода этому полю:

interface SearchFunc {
  (source: string, subString: string): boolean;
}

@MyDecoratorA()
export default class Foo
{
    @MyDecoratorB()
    public mySearchFunc : SearchFunc = (source: string, subString: string) => {

        /*a lot of logic here*/
       return true;
    }
}


var foo = new Foo();
// You can use the field the same way as if it was declared as method
foo.mySearchFunc("a", "b");

Вместо функции стрелки () => {} вы также можете использовать обозначение function:

@MyDecoratorA()
export default class Foo
{
    @MyDecoratorB()
    public mySearchFunc : SearchFunc = function(source: string, subString: string) {

        /*a lot of logic here*/
       return true;
    }
}
...