web-dev-qa-db-fra.com

des interfaces de type struct dans TypeScript/JS?

comme je ne trouvais pas de réponse claire dans les interwebs, voici ma question:

J'ai un "struct" comme ceci:

struct tTest{
   public:
      char foo [1+1]
      char bar [64]
};

Y a-t-il un moyen de construire cela dans TS/JS?

Je pensais que l'utilisation d'interfaces était la bonne solution:

export interface tTest{
   foo: string;
   bar: string
}

Mais il n'y a pas moyen d'ajouter [64] et [1 + 1] aux propriétés, n'est-ce pas? Ce serait génial s'il en existait, car chaque objet de type objet doit être de la même longueur et il serait bien plus difficile de vérifier la longueur et d'ajouter des éléments jusqu'à ce qu'il ait la bonne longueur. J'ai l'impression que ce serait vraiment sale.

Des idées/aide? Merci!

6
Faigjaz

Comme le disent les commentaires: js/ts ne supporte pas le type char et il n'y a aucun moyen de déclarer des longueurs de tableaux/chaînes.

Vous pouvez appliquer cela à l'aide d'un setter:

interface tTest {
    foo: string;
}

class tTestImplementation implements tTest {
    private _foo: string;

    get foo(): string {
        return this._foo;
    }

    set foo(value: string) {
        this._foo = value;

        while (this._foo.length < 64) {
            this._foo += " ";
        }
    }
}

( code dans la cour de récréation )

Vous devrez avoir une classe car les interfaces manquent d'implémentation et ne survivent pas au processus de compilation.
Je viens d’ajouter des espaces pour obtenir la longueur exacte, mais vous pouvez le modifier pour répondre à vos besoins.

8
Nitzan Tomer

Vous ne pouvez pas forcer la longueur d'un tableau dans TypeScript, contrairement à JavaScript.
Disons que nous avons un test de classe comme suit:

class tTest{
       foo = new Array<string>(2);
};

Comme vous pouvez le constater, nous avons défini un tableau de chaînes de longueur 2, avec cette syntaxe, nous pouvons limiter le type de valeurs que nous pouvons placer dans notre tableau:

let t = new tTest();
console.log('lenght before initialization' +  t.foo.length);

for(var i = 0; i < t.foo.length; i++){
    console.log(t.foo[i]); 
}

t.foo[0] = 'p';
t.foo[1] = 'q';
//t.foo[2] = 3; // you can't do this
t.foo[2] = '3'; // but you can do this

console.log('length after initialization' +  t.foo.length);

for(var i = 0; i < t.foo.length; i++){
    console.log(t.foo[i]); 
}

De cette manière, nous ne pouvons pas mettre de valeur numérique dans votre tableau, mais nous ne pouvons pas limiter le nombre de valeurs que vous pouvez mettre à l'intérieur. 

Cour de récréation

1
Alessandro