Created
June 23, 2021 02:13
-
-
Save melwyn95/7630bc4f34f04da6dedd9cfffdf8bbd0 to your computer and use it in GitHub Desktop.
TS type-system hacks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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