web-dev-qa-db-fra.com

Type de caractère TypeScript?

Ma question est très brève. Je suis nouveau sur TypeScript, j'ai cherché ici et là mais je n'ai pas encore trouvé de réponse.

Un TypeScripter expérimenté sait-il s'il existe un type de caractère ou un moyen facile de le réaliser?

25
charliebrownie

TypeScript n'a pas de type pour représenter les chaînes de longueur fixe.

21
Ryan Cavanaugh

Je ne suis pas sûr de facile, mais vous pourriez faire quelque chose avec les types littéraux de chaîne:

type Char = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' 
| 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' 
| 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' 
| 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' 
| 'Y' | 'Z' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' // etc....;

bien sûr, c'est une solution assez fragile et tombe en panne lorsque vous considérez les caractères unicode, et je ne le suggérerais pas vraiment. Comme Ryan le mentionne, JavaScript lui-même n'a aucune notion de chaîne de longueur fixe, ni le concept d'un char distinct d'un string.

4
rossipedia

Vous pouvez utiliser une expression régulière dans TypeGuard pour contenir son type, par exemple: (vous pouvez déclarer une énumération vide pour obtenir un nouveau type à associer au garde de type)

enum CharType { }
export type Char = string & CharType 
const isChar=(str: string): str is Char => /^(.|\n)$/.test(
  str
)
export char(c:string):Char{
//you can also use is char here for to test whether actually is char
   if (!isChar(c)){
       throw new Error('not a char')
   }
   return c
}

Désormais, Char ne correspond qu'à ce qui provient de l'appel de char (par exemple, casté en appelant la fonction plutôt que simplement affirmé lors du build). )

Source d'origine (appliquée à la chaîne de date): objet atomique

Hypothèses: je suppose qu'en mentionnant TypeScript, vous voulez dire un type utilisé pour les vérifications au moment de la compilation par le compilateur TypeScript et ne recherchant aucune sorte d'optimisation du côté js réellement compilé (puisque js n'a que des chaînes)

Le seul problème que je peux voir est que vous pouvez passer n'importe quoi à la fonction char et qu'il ne sera lancé qu'au moment de l'exécution. Mais vous n'atteindrez jamais un état où vous vous attendez à un Char et vous obtenez quelque chose d'autre (puisque les Chars ne viennent que d'appeler char).

Sur une note latérale même Java cast jette juste des exceptions d'exécution.

Bien que l'approche ci-dessus n'ait pas grand-chose à voir avec les lancers, je trouve quelques points communs ...

1
Andreas

Comme je le sais, les types de base de TypeScript n'incluent pas de char.

0
zhangjinzhou

Un Char est simplement un nombre. Étant donné que les types de base de TypeScript n'incluent pas de caractères, vous pouvez stocker un nombre et le convertir dans les deux sens:

var number = "h".charCodeAt(0);
var char = String.fromCharCode(number)


Et à quelque chose comme:

class Char {
    private _value:Number;

    constructor(char: Number | String){
        this.setValue(char);
    }

    get getValue():String {
        return String.fromCharCode(this._value);
    }
    set setValue(char: Number | String) {
          if (typeof char === "number") {
              this._value = char;
          }
          else {
            this._value = char.charCodeAt(0);
          }
    }
}
0
cocoseis