我正在尝试在 TypeScript 中为 GUID 创建一个类型,虽然这看起来应该强制执行以“-”分隔的十六进制字符串,但事实并非如此。
type GUID = `${HexString<8>}-${HexString<4>}-${HexString<4>}-${HexString<4>}-${HexString<12>}`;
type HexString<N extends number> = string & {
readonly length: N;
} & (LowercaseLettersOnly<string> | DigitOnly<string>);
type LowercaseLettersOnly<T extends string> = T extends `${infer U}${infer R}` ? (U extends LowercaseLetter ? LowercaseLettersOnly<R> : never) : T;
type LowercaseLetter = 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
type DigitOnly<T extends string> = T extends `${infer U}${infer R}` ? (U extends Digit ? DigitOnly<R> : never) : T;
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
预期会为不同于有效 GUID 的任何字符串抛出错误
const testGuid: GUID = 'e1b53ee5-4e77-4885-9fb1-e54921d9d87f'; // valid
const testGuid: GUID = 'abcdd-efggh-ijkgl-mndop-qrstuvwx1234'; // For some reason doesn't throw an error