【问题标题】:TypeScript character type?TypeScript 字符类型?
【发布时间】:2017-07-29 11:12:32
【问题描述】:

我的问题很简短。我是 TypeScript 的新手,一直在到处寻找,但还没有找到答案。

是否有经验丰富的 TypeScripter 知道是否有字符类型或实现字符类型的简单方法?

【问题讨论】:

  • 只有一个长度为 1 的字符串有什么问题?
  • @Pointy 真的吗?你认为我没有读完?
  • @Pointy 看起来 OP 要求高级类型...
  • 你在寻找什么目的/优势?

标签: javascript typescript typescript-typings typescript2.0


【解决方案1】:

TypeScript 没有用于表示固定长度字符串的类型。

【讨论】:

  • 在这里“扩展”对话框。 Typescript 扩展了静态键入 javascript 的原生类型。 Javascript 没有 char 类型。所以 type-script 没有 char 类型。
  • 如果只有 string & { length: 1 } 可以被静态推断...我试过了,但是在尝试将任何一个字符的字符串分配给该类型的变量时会引发错误。
【解决方案2】:

我不确定 easy,但你可以对字符串文字类型做一些事情:

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

当然,这是一个相当脆弱的解决方案,当您考虑 unicode 字符时会崩溃,我不会真的建议这样做。正如 Ryan 提到的,JavaScript 本身没有任何固定长度字符串的概念,也没有与 string 不同的 char 的概念。

【讨论】:

  • 可以在个人Char 上工作,但如果你尝试使用字符串,你会得到Type 'string' is not comparable to type 'Char[]'
  • 不错的解决方案。 XDDD
【解决方案3】:

据我所知,打字稿的基本类型不包括字符。

【讨论】:

    【解决方案4】:

    Char 只是一个数字。由于 TypeScript 的基本类型不包括 Chars,你可以做的是存储一个数字并来回转换:

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


    像这样的东西:

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

    【讨论】:

    • 但它不是 any 数字,它至少是一个无符号的 16 位整数。
    • 那么,这有什么关系?
    • 这很重要,因为这意味着我们不能使用内置的number 类型
    • 请注意,Number 是一个未定义长度的浮点值。不要期望更好的性能。
    • 虽然有点晚了,但您可能还想覆盖 toString() 以便它与其他字符串正确连接
    【解决方案5】:

    您可以在 TypeGuard 中使用正则表达式来包含它的类型,例如:(您可以声明一个空枚举来获取与类型保护关联的新类型)

    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
    }
    

    现在 Char 只匹配来自调用 char 的东西(例如,实际上是通过调用函数而不是仅仅在构建时断言。编译器简单地接受返回一个 Char 并且如果你想到它实际上是真的,因为它会否则就扔)

    原始来源(适用于日期字符串): Atomic Object

    假设: 我假设提到打字稿是指打字稿编译器用于编译时检查的类型,而不是在实际编译的 js 端寻找任何类型的优化(因为 js 只有字符串)

    我能看到的唯一问题是您可以将任何内容传递给 char 函数,它只会在运行时抛出。但是你永远不会达到你期望一个字符并且你得到其他东西的状态(因为字符只来自调用字符)。

    附带说明,即使是 java 强制转换也只会抛出运行时异常。

    虽然上述方法可能与演员表没有太大关系,但我确实发现了一些共同点......

    【讨论】:

    • Typescript 太强大了,如果你想到了一种你无法表达的类型,那你可能就错了。
    【解决方案6】:

    您可以在string 周围定义一个包装器,如果字符串超过一个字符,则会引发错误。

    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
    

    当然,你也可以在类中添加辅助方法来操作toLowerCase()toUpperCase()等字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 2017-11-13
      • 2017-03-31
      • 1970-01-01
      • 2019-11-06
      • 2019-04-22
      • 2017-08-24
      • 2021-10-27
      相关资源
      最近更新 更多