gpt4 book ai didi

typescript - 如何排除模板文字类型的子字符串?

转载 作者:行者123 更新时间:2023-12-05 01:31:22 29 4
gpt4 key购买 nike

我想从模板文字类型(自 TypeScript 4.1 起可用)中排除一些子字符串,但我不知道这是否可能。

示例:

我可以定义一个类型说“这个字符串是一个有 2 个或更多元素的类似元组的”,即像 '[string, number]' 这样的东西文字类型:

type TupleWithTwoOrMoreElements = `[${string}, ${string}]`;

现在,我想做相反的事情,即通过排除子字符串 ,创建一个文字类型 “这是一个类似元组的元素少于 2 个”。我想做这样的事情:

type TupleWithLessThanTwoElements = `[${someStringWithoutCommaOrSpace}]`;

我认为不可能写出这种“regex-literal-type”,但我想知道是否有人能够解决这个问题。

最佳答案

不可能(据我所知)为“任何没有逗号的字符串”写一个类型。但是,如果事先知道该字符串,则可以创建一个条件类型来检查该字符串是否包含逗号。

type HasComma<S extends string, IfTrue = true, IfFalse = false> = 
S extends `${string},${string}` ? IfTrue : IfFalse;
type A = HasComma<','> // true
type B = HasComma<'string'> // false
type C = HasComma<'[string, number]'> // true

所以给定一个文字字符串,我们可以验证它并确保它是一个只有一个元素的元组。

type ValidateOneTuple<S extends string, IfValid = S, IfInvalid = never> = 
HasComma<S, IfInvalid, S extends `[${string}]` ? IfValid : IfInvalid>
type A = ValidateOneTuple<'[string, number]'> // never
type B = ValidateOneTuple<'[string]'> // "[string]"
type C = ValidateOneTuple<'[str,ing]'> // never

Typescript Playground Link

关于typescript - 如何排除模板文字类型的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66420752/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com