Что эквивалентно защищенному в TypeScript?

Что эквивалентно защищенной в TypeScript?

Мне нужно добавить некоторые переменные-члены в базовый класс, который будет использоваться только в производных классах.

Ответ 1

Обновления

12 ноября 2014 года. Версия 1.3 из TypeScript доступна и включает в себя защищенное ключевое слово.

26 сентября 2014 года. Ключевое слово protected приземлилось. В настоящее время это предварительный выпуск. Если вы используете очень новую версию TypeScript, теперь вы можете использовать ключевое слово protected... ответ ниже для более старых версий TypeScript. Наслаждайтесь.

Просмотр примечаний к выпуску для защищенного ключевого слова

class A {
    protected x: string = 'a';
}

class B extends A {
    method() {
        return this.x;
    }
}

Старый ответ

TypeScript имеет только private - не защищен, и это означает только конфиденциальность во время проверки времени компиляции.

Если вы хотите получить доступ к super.property, он должен быть общедоступным.

class A {
    // Setting this to private will cause class B to have a compile error
    public x: string = 'a';
}

class B extends A {
    method() {
        return super.x;
    }
}

Ответ 2

Как насчет следующего подхода:

interface MyType {
    doit(): number;
}

class A implements MyType {
    public num: number;

    doit() {
        return this.num; 
    }
}

class B extends A {
    constructor(private times: number) {
        super();
    }

    doit() {
        return super.num * this.times; 
    }
}

Поскольку переменная num определяется как общедоступная, это будет работать:

var b = new B(4);
b.num;

Но поскольку он не определен в интерфейсе, это:

var b: MyType = new B(4);
b.num;

приведет к The property 'num' does not exist on value of type 'MyType'.
Вы можете попробовать это в playground.

Вы также можете обернуть его в модуль при экспорте только интерфейса, а затем из других экспортированных методов вы можете вернуть экземпляры (factory), таким образом, общий объем переменных будет "содержаться" в модуле.

module MyModule {
    export interface MyType {
        doit(): number;
    }

    class A implements MyType {
        public num: number;

        doit() {
            return this.num; 
        }
    }

    class B extends A {
        constructor(private times: number) {
            super();
        }

        doit() {
            return super.num * this.times; 
        }
    }

    export function factory(value?: number): MyType {
        return value != null ? new B(value) : new A();
    }
}

var b: MyModule.MyType = MyModule.factory(4);
b.num; /// The property 'num' does not exist on value of type 'MyType'

Модифицированная версия в этом playground.

Я знаю, что это не совсем то, что вы просили, но это довольно близко.