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-declare interzice 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 = {}));