TypeScript-Zeichentyp?

Lesezeit: 5 Minuten

Benutzer-Avatar
charliebrownie

Meine Frage ist sehr kurz. Ich bin neu bei TypeScript, habe hier und da gesucht, aber noch keine Antwort gefunden.

Weiß ein erfahrener TypeScripter, ob es einen Zeichentyp oder einen einfachen Weg gibt, einen zu erreichen?

  • Grundtypen

    – Spitze

    8. März 2017 um 18:17 Uhr

  • Was ist falsch an nur einem String der Länge 1?

    – Kokoseis

    8. März 2017 um 18:17 Uhr

  • @ Pointy wirklich? Glaubst du, ich habe das nicht gelesen?

    – charliebrownie

    8. März 2017 um 18:21 Uhr

  • @Pointy Sieht so aus, als ob OP nach fortgeschrittenen Typen fragt…

    – Bergi

    8. März 2017 um 18:25 Uhr

  • Welchen Zweck/Vorteil suchen Sie damit?

    – Kokoseis

    8. März 2017 um 21:21 Uhr

TypeScript hat keinen Typ zum Darstellen von Zeichenfolgen fester Länge.

  • Um den Dialog hier quasi zu “erweitern”. Typescript erweitert die statische Eingabe der nativen Javascript-Typen. Javascript hat keinen Char-Typ. Type-Script hat also keinen Char-Typ.

    – Ruf an bei

    12. Juli 2018 um 18:15 Uhr

  • Wenn nur string & { length: 1 } könnte statisch abgeleitet werden … Ich habe es versucht, aber es wird ein Fehler ausgegeben, wenn versucht wird, einer Variablen dieses Typs eine Zeichenfolge mit einem Zeichen zuzuweisen.

    – Patrick Roberts

    12. September 2018 um 3:17 Uhr

Ich bin mir nicht sicher einfachaber Sie könnten etwas mit String-Literaltypen machen:

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....;

Natürlich ist dies eine ziemlich spröde Lösung und bricht zusammen, wenn Sie Unicode-Zeichen berücksichtigen, und ich würde es nicht wirklich vorschlagen. Wie Ryan erwähnt, hat JavaScript selbst weder eine Vorstellung von einer Zeichenfolge mit fester Länge noch das Konzept von a char im Unterschied zu a string.

  • Kann an einer Person arbeiten Charaber wenn Sie versuchen, eine Zeichenfolge zu verwenden, erhalten Sie Type 'string' is not comparable to type 'Char[]'.

    – Raine Revere

    21. August 2020 um 16:21 Uhr


  • Schöne Lösung. XDDD

    – Ambrus Toth

    26. November 2020 um 13:00 Uhr

Benutzer-Avatar
Andreas

Sie könnten eine Regex innerhalb von TypeGuard verwenden, um ihren Typ zu enthalten, z. B.: (Sie können eine leere Aufzählung deklarieren, um einen neuen Typ zu erhalten, der dem Type Guard zugeordnet wird.

enum CharType { }
export type Char = string & CharType
const isChar = (str: string): str is Char => /^(.|\n)$/.test(
    str
)
export function toChar(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
}

Jetzt stimmt Char nur mit Dingen überein, die vom Aufrufen von char stammen (z. B. tatsächlich durch Aufrufen der Funktion gecastet und nicht nur zur Buildzeit bestätigt. Der Compiler akzeptiert einfach, dass ein Char zurückgegeben wird, und das ist tatsächlich wahr, wenn Sie daran denken, da es sonst nur wirft )

Ursprüngliche Quelle (auf Datumszeichenfolge angewendet):
Atomares Objekt

Annahmen: Ich gehe davon aus, dass Sie mit der Erwähnung von Typoskript einen Typ meinen, der vom Typoskript-Compiler für Kompilierzeitüberprüfungen verwendet wird, und nicht nach irgendeiner Art von Optimierung auf der tatsächlich kompilierten js-Seite suchen (da js nur Zeichenfolgen enthält).

Das einzige Problem, das ich sehen kann, ist, dass Sie alles an die char-Funktion übergeben können und es nur zur Laufzeit ausgelöst wird. Aber Sie werden nie einen Zustand erreichen, in dem Sie ein Char erwarten und etwas anderes bekommen (da Chars nur vom Aufrufen von Char kommen).

Nebenbei bemerkt, sogar Java-Casts lösen nur Laufzeitausnahmen aus.

Obwohl der obige Ansatz vielleicht nicht viel mit Casts zu tun hat, finde ich einige Gemeinsamkeiten …

  • Typoskript ist so mächtig. Wenn Sie jemals an einen Typ denken, den Sie nicht ausdrücken können, könnten Sie sich irren.

    –Andreas

    1. Juli 2018 um 15:01 Uhr


Benutzer-Avatar
Kokoseis

Ein Char ist einfach eine Zahl. Da die Grundtypen von TypeScript keine Zeichen enthalten, können Sie eine Zahl speichern und hin und her konvertieren:

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

Und zu etwas wie:

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);
          }
    }
}

Wie ich weiß, enthalten die grundlegenden Typen von Typoskripten kein Zeichen.

Sie könnten einfach einen Wrapper definieren stringund löst einen Fehler aus, wenn die Zeichenfolge aus mehr als einem Zeichen besteht.

class Character {
    readonly char: string;
    constructor(char: string) {
        if(char.length !== 1) {
           throw new Error(char + " is not a single character");
        }
    
        this.char = char;
    }
    
    toString(): string {
       return this.char;
    }
}

////////////////////////////////////////
var good: Character = new Character("f");
var bad: Character = new Character("foo"); //error

Natürlich können Sie der Klasse auch Hilfsmethoden hinzufügen, die wie auf dem String operieren toLowerCase(), toUpperCase()etc.

Als etwas prägnantere Methode als das Auflisten alle Buchstaben können Sie alle Großbuchstaben oder alle Kleinbuchstaben auflisten und dann verwenden Lowercase oder Uppercase um ihre Großschreibung zu ändern und mit dem vorherigen Typ zu vereinheitlichen.

type UpperCaseCharacter="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';
// add additional non-letter characters to this union as desired
type Character = UpperCaseCharacter | Lowercase<UpperCaseCharacter>;

1093190cookie-checkTypeScript-Zeichentyp?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy