typescript1.8 - Hur man skiljer mellan modulnivåvariabler och lokala variabler i TypeScript


Tänk på denna modul:

export module Example{
    let customer : any;

    export function myExample(customer: string) {
        // How to reference the module level customer object here?
        // Is there a standard to make these module level variables Pascal Case to prevent this overlap?
    }
}

Kunden (customer) i funktionen myExample är en sträng. Hur refererar jag till modulnivåns customer?

Om det var en klass, kunde jag använda this.customer men this fungerar inte i en modul, och Example.customer fungerar inte heller, om inte customer exporteras...

Svar #1

Generellt exporterar moduler antingen klasser, funktioner eller andra element som enum.

Koden export module Example som visas i detta exempel anger endast att Example faktiskt är ett namnrymd, vilket betyder att varje referens till funktionen myExample måste föregås av namnrymdens namn, dvs. Example.myExample().

Du har rätt när du säger att kunden inte är tillgänglig om den inte exporteras. Detta beror på att export module Example endast anger ett namnrymd, och inte exporterade variabler eller klasser.

Det är svårt att ana varför du använder export module, istället för export class:

export class Example2 {
    customer: string = 'Example2.customer';
    myExample(customer: string) {
        console.log(`Example ${this.customer}`);
        console.log(`Example ${customer}`);
    }
}

Den här klassen är faktiskt en modul, på grund av användningen av nyckelordet export.

Svar #2

Här är den JS-genererade versionen av frågan TS:

define(["require", "exports"], function (require, exports) {
    "use strict";
    var Example;
    (function (Example) {
        var customer;
        function myExample(customer) {
            // How to reference the module level customer object here?
            // Is there a standard to make these module level variables Pascal Case to prevent this overlap?
        }
        Example.myExample = myExample;
    })(Example = exports.Example || (exports.Example = {}));
});

Eftersom kunden inte exporteras, genereras den som privat. Och nu träder de standardmässiga reglerna för variabelskopning i JavaScript i kraft, och det finns inget sätt att referera till modulsnivå kund. Den enklaste och lättaste lösningen (och enligt min åsikt en standardkonvention för modulsnivå privata variabler) är att använda understreck för den yttersta kunden:

export module Example{
    let _customer : any;

    export function myExample(customer: string) {
        _customer = customer;
    }
}