ghaiklor / type-challenges-solutions

Solutions for the collection of TypeScript type challenges with explanations
https://ghaiklor.github.io/type-challenges-solutions/
Creative Commons Attribution 4.0 International
470 stars 56 forks source link

type-challenges-solutions/en/medium-trim #282

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

Trim

This project is aimed at helping you better understand how the type system works, writing your own utilities, or just having fun with the challenges.

https://ghaiklor.github.io/type-challenges-solutions/en/medium-trim.html

gauravpan commented 1 year ago

Left trim and right trim can combined by using union also as in below.

type Trim<S> = S extends `${infer L}${Whitespace}` | `${Whitespace}${infer R}` ? Trim<T> :S;
ghaiklor commented 1 year ago

@gauravpan interesting, can you explain step by step why it works?

albert-luta commented 1 year ago

As suggested by @gauravpan, we could tell TS to check if there is a white space to either left or right of the string, and let it infer the correct Rest for us.

type Whitespace = " " | "\n" | "\t";
type Trim<S> = S extends
  | `${infer Rest}${Whitespace}`
  | `${Whitespace}${infer Rest}`
  ? Trim<Rest>
  : S;