javascript - Clase TypeScript: constructor și metodă
Încerc să evit declarația dublă în clasele mele Typescript.
Înainte scriam clasele mele astfel:
module ModuleName {
export class ClassName {
public method: () => void;
constructor(
private dependency: any ) {
this.method = () => {
dependency.someUse();
};
}
}
}
Dar declarația tipului metodei (aici public method:() => void;) pare inutilă, mai ales când ai deja o interfață care o declară. Așa că am vrut să scriu:
module ModuleName {
export class ClassName {
constructor(
private dependency: any ) { }
public method = () => {
this.dependency.someUse();
};
}
}
Notă: Pentru a evita avertismentele variabila XXX folosită înainte de declarație, trebuie să punem metodele după constructor.
Dar acum, dacă folosim metodele noastre în constructor, vom primi din nou avertismentele la aceste metode:
module ModuleName {
export class ClassName {
constructor(
private dependency: any ) {
this.method(); // warning here
}
public method = () => {
this.dependency.someUse();
};
}
}
Deci, întrebarea mea este: Cum ar trebui să ne scriem clasele în mod corect?
Notă: Deoarece compilatorul TypeScript corectează ordinea declarațiilor, nu este o mare problemă, vreau doar să știu dacă este posibil să scriu clase fără declarații duble și avertismente.
Răspuns #1
Aceasta sună ca o eroare de la TSLint. Folosești cumva WebEssentials?
S-ar putea să vrei să dezactivezi această regulă, deoarece din ce spui pare a fi buggy. WebEssentials încarcă tslint.json din directorul principal al utilizatorului tău (%userprofile%). Ar trebui să poți găsi un fișier tslint.json acolo. Acesta este locul unde poți activa/dezactiva regulile.
Se pare că există un bug în următoarea regulă
no-use-before-declareinterzice utilizarea variabilelor înainte de declararea lor
Poți dezactiva această regulă adăugând (sau modificând) configurația cu aceasta:
"no-use-before-declare": false
Mai multe informații despre tslint și regulile sale pot fi găsite aici: https://github.com/palantir/tslint/
Răspunsul #2
În cele din urmă, cred că este o idee proastă să elimini acest avertisment, deoarece poate fi foarte util în unele cazuri.
Dar am găsit cum să rezolv problema mea: Dacă mutăm constructorul la sfârșitul clasei, nu mai avem avertismente:
module ModuleName {
export class ClassName {
public method = () => {
this.dependency.someUse();
};
constructor(
private dependency: any ) {
this.method();
}
}
}
Dacă ne uităm la JS-ul generat, este mai ușor de înțeles ce se întâmplă: parametrii constructorului sunt încă plasați la începutul funcției generate:
var ModuleName;
(function (ModuleName) {
var ClassName = (function () {
function ClassName(dependency) {
var _this = this;
this.dependency = dependency;
this.method = function () {
_this.dependency.someUse();
};
this.method();
}
return ClassName;
})();
ModuleName.ClassName = ClassName;
})(ModuleName || (ModuleName = {}));
