typescript 类型,该类型匹配具有任意数量的参数(以逗号分隔)的字符串

fnatzsnv  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(121)

标题是不言自明的。我想要一个类型,可以匹配字符串开始的前缀func和包围由任意数量的参数之间的两个括号。

func(1, 2, 3, 4, 5)
func(1, 2, 3)
func(1, 2, 3, 4, 5, 6, 7)

目前我写了下面的类型,这不是100%我想要的,因为它可以在括号之间包含任何字符串:

type MyType = `func(${string})`
zmeyuzjn

zmeyuzjn1#

请注意,您不能在运行时使用TypeScript类型来验证对象值(为此,您需要正则表达式或zod或joi等验证库)。您只能在编译时验证字符串文字。
话虽如此,回答你的问题,有一个类型,如你所解释的工作:

如果TypeScript支持递归模板文字类型,则很简单:

type Param = number;
type Params = '' | `${Params}, $Paraam`
type Func = `func(${Params})`

不幸的是,这给出了Params类型的错误:
Type alias 'Params' circularly references itself.ts(2456)
因此,我们必须手动列出类型,并设定上限:

type N = number;
type Params = ''
  | `${N}`
  | `${N}, ${N}`
  | `${N}, ${N}, ${N}`
  | `${N}, ${N}, ${N}, ${N}`
  | `${N}, ${N}, ${N}, ${N}, ${N}`
  | `${N}, ${N}, ${N}, ${N}, ${N}, ${N}`
  | `${N}, ${N}, ${N}, ${N}, ${N}, ${N}, ${N}`

type Func = `func(${Params})`

const f: Func = 'func(1, 2, 3, 4, 5, 6, 7)'; // OK
const g: Func = 'func 1, 2, 3, 4, 5, 6, 7 '; // Error

您可以不需要用实用程序类型手动列出它们,但由于不支持递归模板文字类型,因此仍然存在上限。

相关问题