TypeScript 1.0 не генерирует закрытые члены

Я использую Visual Studio 2012 с TypeScript 1.0 и web essentials 3.7. Я объявил некоторые частные статические переменные в своем классе в файле TypeScript. Но когда я сохраняю этот файл, я не вижу этих членов в файле JavaScript, и во время выполнения система выдает исключение.

Сейчас

введите описание изображения здесь

Раньше система использовала для создания этой собственности. Но недавно я обновился до TypeScript 1.0, и теперь я не вижу этих частных статических членов.

Ранее: введите описание изображения здесь


person SharpCoder    schedule 15.04.2014    source источник
comment
Скомпилированный JS мне кажется правильным. Почему ты их больше не видишь?   -  person Johannes Klauß    schedule 15.04.2014
comment
@ JohannesKlauß: Я добавил два изображения. Первый не имеет частных переменных и выдает ошибку во время выполнения, в то время как вторые изображения показывают снимок из предыдущей версии (более старая версия typeScript). Я не уверен, почему вы сказали, что скомпилированная версия вам подходит. Разве это не должно включать объявление частной переменной?   -  person SharpCoder    schedule 15.04.2014


Ответы (2)


Нет необходимости явно упоминать их в скомпилированном JavaScript, потому что это динамический язык, который позволяет добавлять свойство при их первом использовании, например, когда вы устанавливаете значение ...

Поскольку свойство является статическим, вы должны обращаться к нему через имя класса. В приведенном ниже примере User._name.

class User {
    private static _name: string;

    static setName(name: string) {
        User._name = name;
    }

    static getName() {
        return User._name;
    }
}

User.setName('Steve');

alert(User.getName()); // 'Steve'

Как я уже упоминал, нет необходимости «настраивать» тот факт, что будет свойство _name, потому что JavaScript этого не требует. Вот результат из приведенного выше примера:

var User = (function () {
    function User() {
    }
    User.setName = function (name) {
        User._name = name; // this adds a property if it doesn't exist
    };

    User.getName = function () {
        return User._name;
    };
    return User;
})();

User.setName('Steve');

alert(User.getName());

Если вы хотите, чтобы он появился, вам нужно с самого начала присвоить значение:

private static _name = '';
person Fenton    schedule 15.04.2014

При правильном доступе не должно быть никаких исключений. Неопределенные члены, такие как

class A {
    private STATIC: string;
}

имеют значение undefined, что соответствует нормальному Javascript:

var something; // undefined

Typecript, ранее инициализировавший его как "", на самом деле «неправильный» (по сравнению с аналогичными языками). Это, конечно, не что иное, как угадывание машинописного текста. Если вы хотите сохранить это, вам нужно сделать

class A {
    private STATIC: string = "";
}
person Ingo Bürk    schedule 15.04.2014