如何在Type脚本中创建UUID模板文字类型? [英] How to create a UUID template literal type in Typescript?

查看:25
本文介绍了如何在Type脚本中创建UUID模板文字类型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有人成功地使用新的模板文本类型在TypeScrip中为UUID编写了类型?

例如: const id:UUID = "f172b0f1-ea0a-4116-a12c-fc339cb451b6"

此人尝试:UUID Tweet

但类型太复杂:";表达式生成的联合类型太复杂,无法表示。(2590):Example

他的类型:

type Alphabetic = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'
type Alphanumeric = Alphabetic | Numeric

type Repeat<
    Char extends string,
    Count extends number,
    Joined extends string = ``,
    Acc extends 0[] = []
> = Acc['length'] extends Count ? Joined : Repeat<Char, Count, `${Joined}${Char}`, [0,...Acc]>

type UUIDV4 = `${Repeat<Alphanumeric, 8>}-${Repeat<Alphanumeric, 4>}-${Repeat<Alphanumeric, 4>}-${Repeat<Alphanumeric, 4>}-${Repeat<Alphanumeric, 12>}````

推荐答案

我不确定这是否可能,因为TS有他自己的限制。 考虑这个例子:

type Alphabetic = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'
type Numeric = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
type StringNumber<T extends number> = `${T}`
type Alphanumeric = Alphabetic | StringNumber<Numeric>

type Result<T extends string> = T extends any ? T : never;

interface Unit {
  value: Alphanumeric
}

type Check = `${Alphanumeric}${Alphanumeric}${Alphanumeric}`

Check生成超过46.6K的可能状态。 如果您添加另一个${Alphanumeric},它将达到限制。

我怀疑它是否可以在打字系统中表示。

可能在Tail recursive evaluation of conditional types之后

我以为只验证字符串是否有效是可能的,就像我对十六进制表示法here所做的那样,但它似乎也不起作用。

您仍然可以验证已知的UUID文本:

type Alphabetic = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'
type Numeric = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
type StringNumber<T extends number> = `${T}`
type Alphanumeric = Alphabetic | StringNumber<Numeric>
type Separator = '-'

type UUID = 'f172b0f1-ea0a-4116-a12c-fc339cb451b6'


type Template = [8, 4, 4, 4, 12];

type IsValid<T, Cache extends string[] = []> =
  T extends string ?
  T extends ''
  ? Cache
  : T extends `${infer Char}${infer Rest}`
  ? Char extends Alphanumeric ? IsValid<Rest, [...Cache, Char]>
  : never
  : never
  : never

type Split<S extends string, D extends string> =
  string extends S ? string[] :
  S extends '' ? [] :
  S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] : [S];

type StringLength<T, Cache extends any[] = []> =
  T extends string ?
  T extends ''
  ? Cache['length']
  : T extends `${infer Char}${infer Rest}`
  ? StringLength<Rest, [...Cache, Char]>
  : never
  : never

type Every<T extends any[], Cache extends any[] = []> =
  T extends []
  ? Cache
  : T extends [infer Head, ...infer Rest]
  ? Every<Rest, [...Cache, IsValid<Head>['length']]>
  : never

type IsCorrect<T extends string,> = Every<Split<T, Separator>> extends Template ? true : false

type Test = IsCorrect<'f172b0f1-ea0a-4116-a12c-fc339cb451b6'> // ok
type Test2 = IsCorrect<'f172b0f1-ea0a-4116-a12c'> // false
type Test3 = IsCorrect<'f172b0f1-ea0a-4116-a12c-fc339cb451b6--'> // false
type Test4 = IsCorrect<'f172b0f1-ea0a-4116-a12c-fc339cb451b'> // false
type Test5 = IsCorrect<'f172b0f1-ea0a-4116-a%%c-fc339cb451b'> // false
type Test6 = IsCorrect<'f172b0f1ea0a-4116-a12c-fc339cb451b6'> // false

这篇关于如何在Type脚本中创建UUID模板文字类型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆