type ValidCodes = `${number}` //"0" | "1" | "2" | "31" | "32" | "33"
type Tail<T> = T extends [infer _FirstItem, ...infer Rest] ? Rest : never
type Merge<A extends ValidCodes[]> = Tail<A>['length'] extends 0
? A[0]
// @ts-expect-error Type 'DotMergeTuple<Tail<A>>' is not assignable to type 'string | number | bigint | boolean'.
: `${A[0]};${Merge<Tail<A>>}`
type Split<T> = T extends `${infer A};${infer B}`
? [A, ...Split<B>]
: [T]
type T01 = Merge<['1', '1', '33', '31']>
type T02 = Split<'0;1;2;31;32'>
type T = Merge<Split<'0;1;2;31;33;x'>> // Type "x" is not assignable to type `${number}`.
5条答案
按热度按时间r55awzrz1#
仅适用于TS >=4.5
可以创建独立类型。
请看这个例子:
Playground
Mapped
类型是一个实用程序类型,它表示while
循环。它迭代直到Result
的长度达到N
。换句话说,Mapped<10>
-将迭代10次。在纯js中看这个例子:在js中很难表示联合,这就是为什么我使用
join('')
。我希望它是清楚的,它是如何工作的。如果你想增加
MAXIMUM_ALLOWED_BOUNDARY
到500,它会加热你的CPU,所以要小心。正如你可能已经注意到的,在类型脚本中不可能表示类型的递归模式,但可以创建足够大的联合。
请记住,
${number}
类型有一些缺点。你可以使用带前导零的数字,如下所示:有用链接:
nhhxz33t2#
我不认为有一种方法可以为变量声明中使用的类型定义无限重复模式。
然而,函数上的类型保护可以检查字符串是否匹配无限模式,就像这样(playground):
waxmsbnn3#
您可以直接选择
string
类型,如果您想要:否则,如果你想缩小它的范围,那么最好将它声明为
const
:那么你的类型将是
myLocation
的值zfciruhq4#
我从我的另一个TS挑战中借用了这个,我试图混合控制台颜色 (要点),它检测到无限的重复,但我还没有弄清楚如何实际应用它作为一个后卫。所以这更像是一个有趣的练习。
whitzsjs5#
你可以使用
as const
Assert从模板文本中获取字符串文本类型,如下所示:TSPlayground