-
Notifications
You must be signed in to change notification settings - Fork 9
Description
I'm not even sure it is possible, but it would be nice to get the captured group names properly typed, like @anuraghazra did here:
https://github.com/anuraghazra/type-trident/blob/main/src/typed-regex-named-groups
https://tsplay.dev/N5LV2w
such that
const fooMatcher = namedCapture('foo', /fo+/).exec('fooooo')would return a restult whose groups has foo defined, ready for error detection and autocompletion.
Doing it for a single capture name is straightforward, but then...
const barMatcher = namedCapture('bar', /ba+r/).exec('fooooo')
const fooBarMatcher = either(fooMatcher, barMatcher)would have to merge the capture groups.
To make things harder, the compose-regexp combinators are variadic.
I haven't dabbed in advanced typings in a while, and even at my peak TS I don't think I could have written this off the top of my head. I may get to it at some point, but help would be welcome.
I suppose that a starting point would be to create an interface like this:
interface CmpRegExp<T, U> extends RegExp {
exec(s:string):
| null
| (Omit<RegExpExecArray, "length" | keyof Array<any>> & T & U)
// ...
}then make the combinator type-aware and have capture() and namedCapture() grow the length of the RegExpIndices, and namedCapture() add the name to the groups array (or give a type error when trying to override a name that's already defined).
Another tricky issue is the possibility of rejecting invalid ref() at compile time.
sequence(capture("a"), ref(2)) should throw a type error.
sequence(ref(1), capture("a")), while nonsensical (it never matches), is a valid JS RegExp. I don't think that TS can be made aware of the direction of matching (in look behind blocks) like compose-regexp can, so this looks like a dead end on the typing front.