假设我想允许一个十六进制字符串;那么唯一允许的值将是0-9a-f。在TypeScript中有没有一种方法定义一个只接受特定字符串的类型字符串?
// valid
const valid: HexString = '123abc';
// invalid
const invalid: HexString = 'ijk';
我知道正则表达式类型定义是一个提议,这里有一个链接,不过我想知道是否有一种方法在此期间实现它。
假设我想允许一个十六进制字符串;那么唯一允许的值将是0-9a-f。在TypeScript中有没有一种方法定义一个只接受特定字符串的类型字符串?
// valid
const valid: HexString = '123abc';
// invalid
const invalid: HexString = 'ijk';
我知道正则表达式类型定义是一个提议,这里有一个链接,不过我想知道是否有一种方法在此期间实现它。
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的函数。
createHexCode()
的实现在传入的字符串不符合正则表达式时抛出运行时错误。或者createHexCode()
返回一个HexCode | undefined
。甚至可以使用isHexCode(str: string): str is HexCode
类型守卫。 - jcalztype HexCode = Opaque<string, "HexCode">
?你是不是想说type HexCode = Opaque<"HexCode", string>
? - weakish