TypeScript 1.8 - TypeScript'te modül düzeyi değişkenler ile yerel değişkenler nasıl ayırt edilir


Bu modülü göz önünde bulundurun:

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?
    }
}

myExample fonksiyonundaki customer bir stringtir. Modül seviyesindeki customer'a nasıl başvurabilirim?

Eğer bir sınıf olsaydı, this.customer kullanabilirdim ama bir modülde this çalışmaz ve Example.customer da çalışmaz, customer dışa aktarılmadıkça...

Cevap #1

Genel olarak, modüller ya sınıfları, fonksiyonları ya da enumlar gibi diğer öğeleri dışa aktarır.

Bu örnekte gösterildiği gibi export module Example, yalnızca Example'ın aslında bir ad alanı olduğunu belirtir, yani myExample fonksiyonuna yapılacak her referansın ad alanı adı ile öneklenmesi gerekir, yani Example.myExample().

Müşterinin yalnızca dışa aktarılmadıkça mevcut olmadığını söylediğinizde haklısınız. Bunun nedeni, export module Example ifadesinin yalnızca bir ad alanını belirtmesi ve değişkenler veya sınıflar gibi öğeleri dışa aktarmamasıdır.

export class yerine neden export module kullandığınızı tahmin etmek zor:

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

Bu sınıf aslında bir modüldür, çünkü export anahtar kelimesi kullanılmıştır.

Cevap #2

İşte sorunun JS tarafından üretilmiş TS versiyonu:

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

Müşteri dışa aktarılmadığı için özel olarak oluşturulmaktadır. Ve şimdi, standart Javascript değişken kapsamı kuralları geçerli olur ve modül düzeyindeki müşteriye başvurmanın hiçbir yolu yoktur. En basit ve kolay çözüm, (ve bana göre modül düzeyindeki özel değişkenler için standart bir uygulama) en dıştaki müşteri değişkeninin önüne alt çizgi koymaktır:

export module Example{
    let _customer : any;

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