为什么 TypeScript 中的这种 GUID 类型没有按预期运行?

问题描述 投票:0回答:0

我正在尝试在 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
typescript guid typescript-template-literals
© www.soinside.com 2019 - 2024. All rights reserved.