переопределение метода аннотирования в typescript, чтобы упростить просмотр кода

#typescript #visual-studio-code

#typescript #visual-studio-code

Вопрос:

Существует ли какое-либо соглашение об именовании, или редактирование фрагментов, или какое-либо расширение VS code, или какие-либо библиотеки NPM, чтобы помечать методы переопределения тегов в typescript. Это полезно при просмотре кода.

Точно так же, как переопределить синтаксис в Java

 @override << ###### SOMETHING like this ######
@public String toString(){
   // your overridden code.
   return something;
}
  

Ответ №1:

override Ключевое слово было добавлено в TypeScript 4.3, как вы можете видеть здесь.
Пример использования:

 class SomeComponent {
  show() {
    // ...
  }
  hide() {
    // ...
  }
}

class SpecializedComponent extends SomeComponent {
  override show() {
    // ...
  }
  override hide() {
    // ...
  }
}
  

Чтобы сделать его обязательным, вы можете установить noImplicitOverride true в вашем tsconfig.

Комментарии:

1. Как ни странно, это, похоже, не работает при реализации интерфейса

2. @alex-jesper Ваш случай отличается. Изменение метода интерфейса приведет к ошибкам в реализующих его классах (если ваш метод a () теперь называется b (), вам придется реализовать метод b в своих классах). То же самое неверно, если вы изменяете метод суперкласса без ключевого слова в переопределении. Проверьте ссылку для получения дополнительной информации

3. Конечно. Но все равно было бы уместно указать, переопределяет ли метод в реализующем классе метод или нет. Вот как это работает, например, в Java.

Ответ №2:

На данный момент нет переопределяющего ключевого слова или декоратора, но вы можете написать свой собственный декоратор:

 const override = < Sup >( sup : { prototype : Sup } ) => <
    Field extends keyof Sup ,
    Proto extends { [ key in Field ] : Sup[ Field ] } ,
>(
    proto : Proto ,
    field : Field ,
    descr : TypedPropertyDescriptor< Sup[ Field ] > ,
)=> {}
  

И используйте его следующим образом:

 class Super {
   myMethod():void {
      console.log("Super")
  }
}

class A extends Super {
  @override(Super)
  myMethod():void {
    console.log("A")
  }
}
  

Взято с github.