特定字符的TypeScript类型字符串

4

假设我想允许一个十六进制字符串;那么唯一允许的值将是0-9a-f。在TypeScript中有没有一种方法定义一个只接受特定字符串的类型字符串?

// valid
const valid: HexString = '123abc';
// invalid
const invalid: HexString = 'ijk';

我知道正则表达式类型定义是一个提议,这里有一个链接,不过我想知道是否有一种方法在此期间实现它。

1个回答

7
只有使用"OpaqueTypes"或"Nominal Types",只要你有一个能将字符串转化为十六进制代码的实现,其实现方式如下。
export type Opaque<K, T> = T & { __TYPE__: K };
type HexCode = Opaque<string, "HexCode">

const createHexCode = (str: string): HexCode => {
  // implementation that forces string to be hexCode
  return str.toString() as HexCode // casting is needed.
}
const test = createHexCode("#333");
const isAssignableString: string = test; // yes anything that is HexCode is still technically a string.
const isAssignableHexCode: HexCode = "standard string" // error

这种模式也适用于像PositiveInteger和PasswordHash这样的内容,当你不希望任何人意外地将普通字符串分配给该值时,你想强制人们使用返回PasswordHash的函数。


1
你可能希望createHexCode()的实现在传入的字符串不符合正则表达式时抛出运行时错误。或者createHexCode()返回一个HexCode | undefined。甚至可以使用isHexCode(str: string): str is HexCode类型守卫。 - jcalz
是的,@jcalz,这些都很重要。我认为我应该让他自己决定,因为这肯定取决于使用情况。即使只返回默认值,在许多用例中也可以起作用(例如,游戏如何将缺失的纹理设置为默认紫色或醒目的颜色,以便用户可以看到它缺失而不是抛出错误)。 - Shanon Jackson
1
type HexCode = Opaque<string, "HexCode">?你是不是想说 type HexCode = Opaque<"HexCode", string> - weakish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接