模板文字类型打字稿重复

2024-04-30

是否可以使用模板文字类型构建重复?例如:

type Hex = 'a' | 'b' | 'c'| ...;
type Id = `${Hex}${Hex}...` // Here I want to say Id is N hex long. 

原则上,这可以通过 TS 4.1 中的递归条件类型实现:

type Decrement = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
type RepeatString<S extends string, N extends number> =
    N extends 1 ? S :
    `${S}${RepeatString<S, Decrement[N]>}`
type T11 = Decrement[5] // 4
type T12 = RepeatString<"foo", 3> // "foofoofoo"
type T13 = RepeatString<Hex, 3> // "aaa" | "aab" | ... | "ccb" | "ccc"

请注意以下事项局限性 https://github.com/microsoft/TypeScript/pull/40336:

请注意,联合类型的跨产品分布可能会迅速升级为非常大且成本高昂的类型。另请注意,联合类型是限于少于 100,000 名选民[.](我的强调)

例如,与Hex2 being 'a' | 'b' | ... | 'i' | 'j'(10 个联合部件),type T14 = RepeatString<Hex2, 5>将触发以下错误(10*10*10*10*10排列):

表达式生成的联合类型过于复杂而无法表示。(2590)

在这种情况下,需要减少联合部分的数量,例如查找更大的字符串块而不是原子字符。

选择

type RepeatStringAlt<S extends string, N extends number> = RepeatStringAltRec<S, TupleOf<unknown, N>>
type RepeatStringAltRec<S extends string, T extends unknown[]> =
    T["length"] extends 1 ? S : `${S}${RepeatStringAltRec<S, DropFirst<T>>}`
    
type TupleOf<T, N extends number> = N extends N ? number extends N ? T[] : _TupleOf<T, N, []> : never;
type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? R : _TupleOf<T, N, [T, ...R]>;
type DropFirst<T extends readonly unknown[]> = T extends readonly [any?, ...infer U] ? U : [...T];

type T23 = RepeatStringAlt<"foo", 3> // "foofoofoo"

这摆脱了手动计算数字范围的麻烦Decrement.

实时代码游乐场 https://www.typescriptlang.org/play?#code/PTAECUFMAdIQwC4GUECcCWA7A5qA7uggBagAikAxqpALaSYKgUD2Arg5KgFBcICesUAAlIAD1ABeUAHI400AB8ZAI3lLpFaQG5eAyMLEAmSTLmKVamZvPSAJpemQHAMwfYHRB%20gcAraT35BcipaekYpAG1MSAA3TgAaUAAGRIBGRMNEgGZEgBZEgFZEgDZEgHZEgA5EgE40pIBdXUEoWEQUDBwAHiRQMQR6WwBnUCG0LGxEgDk%200QHMYdBMVhplTgA%20SS5QHdAZ-sGR1NAAflBegC5t3YADABIAbyQAX0fW%20GRx7qRE4Oo6BgRKYNdbPG4BPSgAAqqWOUj%20oUBBQaoBAoFyzX0MOMUne7S%202C6ACJnMxmETsps0SSyaTmHSiZjoaksiY8Z9OoSRKJKaiwES4IKieYBXBlMKlAA6aUi5RC2ViiWgaWSkUUCjitXqxmBLGpXJsmAfDoTLrczKgApUsAAUVQqGYqAuoBtomg1CGQ3QzEwoHdzFsrAokBGcFA7G9vt1oGIiFA6BGCDJTGYNGgABsxDHmKBqO6Q2FJQAKQwFGpJACUEJaRvxnIAgumED1ZvNFmNOdNW4clis1qhNrjaxyJo2EFAKD1ElDWBnIAB5ZxddgAa0wzDwmGm63WTPZJpwY4nLYOCxGHYm0%207Z-DmDXG8wERBW120IiRMzOGIRJRp8WxzOS5QHuJ5XgefcCSPSgpzIB1oAAMXQVAxi6KEdzBa4diZGc50XVCuz-EZllWDYTH2OYexmM5iP7a9Fiot8UWdAB9HDMzwqFpkSJ9NmdaI4lQHRo1Y2d2KXTi9jooi%20wSCApNve9Nx4tkImkT9sGIaRfwom8GPAUAWLYhdxK40AIgklVwBBITIVIODEOQ5soXk6g4FsH10z4BT1yU58pGcwjc3gdzME8sy4EwPgTkSFUsGcThQAAVRRM5EoMsyVShBodGwww4WhUTjK6GJmHQWxKS0PkzJKsrEhq8rQHqppoyhQwcVg5gEKQlDWtSa1qtKhqmty1khzaEdDybYkGV5ak6XmskdUhVqDTG41IKm7l6nWIA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板文字类型打字稿重复 的相关文章

随机推荐