Pytanie Maszynopis: Metoda może być statyczna


maszynopis w wersji 2.1.0

Napisałem następujące ServerRouter.ts

import {Router, Request, Response, NextFunction} from 'express';

export class ServerRouter {
  router: Router;

  /**
   * Initialize the ServerRouter
   */
  constructor() {
    this.router = Router();
    this.init();
  }

  /**
   * GET index page
   */
  public  getIndex(req: Request, res: Response, next: NextFunction) {
    res.render('index');
  }

  /**
   * Take each handler, and attach to one of the Express.Router's
   * endpoints.
   */
  init() {
    this.router.get('/', this.getIndex);
  }

}

// Create the ServerRouter, and export its configured Express.Router
const serverRouter = new ServerRouter().router;
export default serverRouter;

Ostrzeżenie inspekcji Webstorm

> Metoda może być statyczna

jest podniesiony na temat funkcji getIndex ():

ALE

Jeśli zmieniłem go na statyczny

public static getIndex ()

, pojawia się błąd: TS2339 "getIndex" nie istnieje w typie "ServerRouter"

Co mam zmienić?

dzięki za opinie


14
2018-03-27 16:44


pochodzenie


Zgaduję: this.router.get ('/', ServerRouter.getIndex); powinno być dobrze ... jeśli tak? czemu ? (dowolny link do wyjaśnienia) dzięki - erwin


Odpowiedzi:


Metoda statyczna istnieje na klasa zamiast instancji obiektu. Musiałbyś się zmienić this.getIndex do ServerRouter.getIndex w Twoim init funkcjonować.

WebStorm sugeruje, aby metody były statyczne, jeśli nie dotykają żadnego stanu instancji, ponieważ sugeruje, że metoda istnieje na poziomie, który jest wszystko wystąpienia tej klasy.

Możesz dowiedzieć się więcej na ten temat static w Podręcznik TypeScript (patrz sekcja "Właściwości statyczne").


23
2018-03-27 16:46



Wielkie dzięki Ben, za twoją opinię ... działa Nauka TS ... każdego dnia! - erwin
Zgodnie z tą odpowiedzią połączyć bezpośredni dostęp ma problemy ... więc co jest najlepszą praktyką? Właśnie usunąłem wszystkie "statyczne" z członków i naprawiłem wszystkie zdarzenia za pomocą zastrzyku ahahah, czy powinienem wrócić? - Sampgun
@TonySamperi Zgodziłbym się z tą odpowiedzią i pójdę z zastrzykiem zależności na pojedynczą instancję zamiast statycznych metod. Ułatwia testowanie kodu, jak również korzyści opisane w tej odpowiedzi. Nie martw się zbytnio o TypeScript, sugerując, że te metody mogą być statyczne - instancja singleton-injected injected jest po prostu alternatywnym rozwiązaniem dla klas statycznych i wcale nie jest gorsza. - Ben Elliott
Dziękuję bardzo! - Sampgun