TypeScript 类型特定字符的字符串

Kou*_*sha 4 javascript typescript

假设我想允许使用十六进制字符串;所以唯一允许的值为 0-9a-f。TypeScript 有没有办法定义只接受某些字符串的类型字符串?IE

// valid
const valid: HexString = '123abc';
// invalid
const invalid: HexString = 'ijk';
Run Code Online (Sandbox Code Playgroud)

我知道正则表达式类型定义是这里的一个提案,想知道是否有办法同时实现这一点。

Sha*_*son 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
Run Code Online (Sandbox Code Playgroud)

这种模式对于 PositiveInteger 和 PasswordHash 之类的东西也很有用,在这些情况下,您不希望任何人意外地将纯字符串分配给您想要强制人们使用返回 PasswordHash 的函数的值