Skip to content

Instantly share code, notes, and snippets.

@melwyn95
Created June 23, 2021 02:13
Show Gist options
  • Save melwyn95/7630bc4f34f04da6dedd9cfffdf8bbd0 to your computer and use it in GitHub Desktop.
Save melwyn95/7630bc4f34f04da6dedd9cfffdf8bbd0 to your computer and use it in GitHub Desktop.
TS type-system hacks
type str = "racecar"
// will require a-z
type Alphabet = 'r' | 'a' | 'c' | 'e'
type ReverseStr<Str extends string> =
Str extends ''
? Str
: Str extends `${infer Chr}${infer Str}`
? Chr extends Alphabet
? `${ReverseStr<Str>}${Chr}`
: never
: never
type Palindrome<Str extends string> = Str extends ReverseStr<Str> ? string : never
type x = Palindrome<str>
type PrependNextNum<A extends Array<unknown>> =
A['length'] extends infer T
? ((t: T, ...a: A) => void) extends ((...x: infer X) => void) ? X : never
: never;
type EnumerateInternal<A extends Array<unknown>, N extends number> =
N extends A['length'] ? A : EnumerateInternal<PrependNextNum<A>, N>;
export type Enumerate<N extends number> = EnumerateInternal<[], N> extends (infer E)[] ? E : never;
export type Range<FROM extends number, TO extends number> = Exclude<Enumerate<TO>, Enumerate<FROM>>;
type MyNum = Range<20, 30>;
const x: MyNum = 20;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment