108 - Trim
type Space = ' ' | '\t' | '\n';
type Trim<S extends string> = S extends `${Space}${infer T}` | `${infer T}${Space}` ? Trim<T> : S;
very good
nice, thank you
666
type A = ' ' | '\n' | '\t'
type TrimLeft<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : S
type TrimRight<S extends string> = S extends `${infer R}${A}` ? TrimRight<R> : S
type Trim<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : S extends `${infer R}${A}` ? TrimRight<R> : S
Why it didn't work?
@zqqcee
type A = ' ' | '\n' | '\t' type TrimLeft<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : S type TrimRight<S extends string> = S extends `${infer R}${A}` ? TrimRight<R> : S type Trim<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : S extends `${infer R}${A}` ? TrimRight<R> : SWhy it didn't work?
type A = ' ' | '\n' | '\t'
type TrimLeft<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : TrimRight<S>
type TrimRight<S extends string> = S extends `${infer R}${A}` ? TrimRight<R> : S
type Trim<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : TrimRight<S>
Thanks!
**zqqcee ** commented Jun 2, 2023 •
type TrimLeft<S extends string> = S extends `${Space}${infer R}` ? TrimLeft<R> : S
type TrimRight<S extends string> = S extends `${infer L}${Space}` ? TrimRight<L> : S
type Trim<S extends string> = TrimLeft<TrimRight<S>>
also works
type A = ' ' | '\n' | '\t' type TrimLeft<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : S type TrimRight<S extends string> = S extends `${infer R}${A}` ? TrimRight<R> : S type Trim<S extends string> = S extends `${A}${infer R}` ? TrimLeft<R> : S extends `${infer R}${A}` ? TrimRight<R> : SWhy it didn't work?
My answer is:
type Space = ' ' | '\n' | '\t'
type TrimLeft<S extends string> = S extends `${Space}${infer Rest}` ? TrimLeft<Rest> : S
type TrimRight<S extends string> = S extends `${infer Rest}${Space}` ? TrimRight<Rest> : S
type Trim<S extends string> = TrimRight<TrimLeft<S>>
type Space = ' ' | '\t' | '\n'; type Trim<S extends string> = S extends `${Space}${infer T}` | `${infer T}${Space}` ? Trim<T> : S;
I'm a pig
nice
NiuBi!
type Space = " " | "\n" | "\t";
type Trim<S extends string> = S extends `${Space}${infer R1}`
? Trim<R1>
: S extends `${infer R2}${Space}`
? Trim<R2>
: S;
type Trim<S extends string> = S extends `${Space}${infer R}` | `${infer R}${Space}` ? Trim<R> : S
type Space = ' ' | '\t' | '\n'; type Trim<S extends string> = S extends `${Space}${infer T}` | `${infer T}${Space}` ? Trim<T> : S;
It's always good to see a better solution. The trick was identifying the extra characters as a separate type and then write the recursive part.
my initial solution looked like this 😅
type Trim<S extends string> = S extends ` ${infer A} ` | ` ${infer A}` | `${infer A} ` ? Trim<A> :
S extends `\n\t${infer B}` |`${infer B} \t` ? Trim<B> : S
I solved it but in a very strange way. And probably inefficient
type Space = ' ' | '\n' | '\t'
type TrimLeft<S extends string> = S extends `${infer F}${infer R}` ?
F extends Space ? `${TrimLeft<R>}` : `${F}${R}`
: ''
type Reverse<S extends string> = S extends `${infer F}${infer R}` ?
`${Reverse<R>}${F}` : ''
type Trim<S extends string> = TrimLeft<Reverse<TrimLeft<Reverse<S>>>>