字符类型? ?

我的问题很简短。我是 TypeScript 的新手,到处搜索,但还没有找到答案。

任何有经验的 TypeScripter 知道是否有一个字符类型或一个简单的方法来实现一个?

52456 次浏览

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

我不太确定 放松,但是你可以用字符串文字类型做一些事情:

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。

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

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

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
}

现在 Char 只匹配来自调用 Char 的内容(例如,实际上是通过调用函数而不是仅仅在构建时声明进行强制转换)。编译器只是简单地接受返回一个 Char,如果你想到它,这实际上是真的,因为它只会抛出其他)

原始来源(应用于日期字符串) : 原子物体

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

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

值得注意的是,即使是 java 强制转换也只是抛出运行时异常。

虽然上面的方法可能与强制转换没有太大关系,但是我确实发现了一些共性..。

您可以只定义 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()等)进行操作。

作为一种比 列出字母字符更简洁的方法,你可以列出所有的大写字母或小写字母,然后使用 LowercaseUppercase来改变它们的大写字母并与之前的类型统一。

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