Подтвердить что ты не робот

Конечное ключевое слово в typescript?

Есть ли способ сделать доступную переменную доступной только один раз? Как этот

interface IFACE{
 a: number;
 final b: number;
}

IFACEConstructor (a: number): IFACE {
 return {a: a, b: 1}
}

test = IFACEConstructor(2);
test.a = 5 //OK
test.b = 2 //Error
4b9b3361

Ответ 1

Он будет доступен с версии 1.4, вы можете проверить Объявление статьи TypeScript 1.4, раздел поддержки "Let/Const" :

"TypeScript теперь поддерживает использование 'let и' const в дополнение к var. В настоящее время они требуют режима вывода ES6, но были исследованы ослабление этого ограничения в будущих версиях.

Const должен быть реализован в соответствии с статьей.

Вы можете получить TypeScript 1.4 здесь.

Обновление 1

Конечно, "const не совпадает с окончательным". Вопрос: "Есть ли способ сделать переменную доступной для назначения только один раз?". Итак, согласно этой документации:

Объявления Const должны иметь инициализатор, если только в окружающем контексте

Ошибка записи в Const

const c = 0;
console.log(c); // OK: 0

c = 2; // Error
c++; // Error

{
    const c2 = 0;
    var c2 = 0; // not a redeclaration, as the var is hoisted out, but still a write to c2
}

И, на данный момент (ноябрь 2015), "const" мне кажется единственным способом, предоставленным TypeScript из коробки, для выполнения вышеуказанной задачи.

Для тех, кто отказался - если у вас есть другой ответ, пожалуйста, поделитесь им в этой теме с сообществом.

Обновление 2: только для чтения

В TypeScript 2.0 был добавлен модификатор readonly (благодаря @basarat). Вы можете инициализировать их в точке объявления или в конструкторе.

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

class Foo {
    readonly bar = 1; // OK
    readonly baz: string;
    constructor() {
        this.baz = "hello";  // OK
    }
}

Но как сказал @RReverser в этот поток:

Как обычно со всеми свежими материалами, вам нужно использовать npm я typescript @next, чтобы получить последний компилятор с экспериментальными функциями включен.

Ответ 2

Вы можете использовать set/get для достижения результата.

class Test {

    constructor(public a: number, private _b: number) {}

    get b(): number {
        return this._b;
    }

}

var test = new Test(2, 1);

test.a = 5 //OK
test.b = 2 //Error

test.b не может быть установлен, потому что у него нет setter.

Компилятор TS не будет предупреждать вас об этом, но браузер выдает ошибку.

Ответ 3

Нет ключевого слова final, но вы можете использовать readonly следующими способами:

Назначить один раз

class IFACE {
    constructor(public a: number, readonly b: number) {}
}

let test: IFACE = new IFACE(1, 34);

 test.a = 5; // OK
// test.b = 2; // Error

console.log(test.a, test.b); // 5 34

Отключить переопределение

class IFACE {
    constructor(public a: number, readonly b: number) {
        // console.log(`b is ${this.b}`);
        this.b = 2; // b is always 2
        // console.log(`b is ${this.b}`);
    }
}

let test: IFACE = new IFACE(1, 34);

test.a = 5;
console.log(test.a, test.b); // 5 2

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

Обратите внимание, что вы можете изменить последнее на это, если двойное назначение вас беспокоит так же, как и я:

class IFACE {
    a: number;
    readonly b: number = 2;

    constructor(a: number) { this.a = a; }
}