web-dev-qa-db-fra.com

Mot-clé final en caractères dactylographiés?

Est-il possible de rendre une variable disponible pour être assignée une seule fois? Comme ça

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
23
Andrei Andreev

Il sera disponible depuis la version 1.4, vous pouvez consulter l’article Annonce de TypeScript 1.4, section de support "Let/Const" :

"TypeScript prend désormais en charge l’utilisation de" let "et" const "en plus de" var ". Celles-ci requièrent actuellement le mode de sortie ES6, mais nous envisageons d’assouplir cette restriction dans les versions futures."

Const doit être implémenté selon le article .

Vous pouvez obtenir TypeScript 1.4 ici .

Mise à jour 1

Bien sûr, "const n'est pas la même chose que final". La question était "Est-il possible de rendre une variable disponible pour être affectée une seule fois?" . Ainsi, selon cette documentation :

Les déclarations const doivent avoir un initialiseur, sauf dans un contexte ambiant

C'est une erreur d'écrire à un 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
}

Et, pour le moment (nov. 2015), "const" me semble être le seul moyen, fourni immédiatement par TypeScript, d'accomplir la tâche ci-dessus.

Pour ceux qui ont voté - si vous avez une autre réponse, partagez-la dans ce fil avec la communauté.

Mise à jour 2: en lecture seule

Le modificateur readonly (grâce à @basarat) a été introduit dans TypeScript 2.0. Vous pouvez initialiser Les au point de déclaration ou dans le constructeur.

Vous pouvez même déclarer une propriété de classe en lecture seule. Vous pouvez initialiser les au moment de la déclaration ou dans le constructeur, comme indiqué ci-dessous:

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

Mais comme dit @RReverser dans ce fil :

Comme d'habitude avec toutes les nouveautés, vous devez utiliser npm i TypeScript @ next pour obtenir le dernier compilateur avec des fonctionnalités expérimentales inclus.

20
TSV

Vous pouvez utiliser set/get pour obtenir le résultat.

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 ne peut pas être défini car il n'a pas de setter.

Le compilateur TS ne vous préviendra pas, mais le navigateur émettra une erreur.

3
Mihai Răducanu

Il n'y a pas de mot-clé final, mais vous pouvez utiliser readonly des manières suivantes:

Attribuer une fois

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

Désactiver le dépassement

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

Vous ne savez pas si le dernier problème est un bug, car vous affectez un champ en lecture seule deux fois - une fois dans le paramètre constructeur et une fois dans le corps du constructeur.

Notez que vous pouvez changer le dernier en ceci si la double affectation vous dérange autant que moi:

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

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