Skip to content

Instantly share code, notes, and snippets.

@gvergnaud
Created September 29, 2022 12:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gvergnaud/6bd4967ddcf50b8fb7f0d3b7b11e55dd to your computer and use it in GitHub Desktop.
Save gvergnaud/6bd4967ddcf50b8fb7f0d3b7b11e55dd to your computer and use it in GitHub Desktop.
type Range<n, range extends any[] = []> =
range['length'] extends n ? range : Range<n, [...range, range['length']]>
type Drop1<a extends any[]> =
a extends [...infer inits, any] ? inits : []
type Concat<a extends any[], b extends any[]> = [...a, ...b]
type Plus<a, b> =
[...Range<a>, ...Range<b>]['length']
type MulRange<a extends any[], b extends any[]> =
a extends [...infer inits, any]
? Concat<b, MulRange<inits, b>>
: []
type Cast<a, b> = a extends b ? a : never
type Mul<a, b> = MulRange<Range<a>, Range<b>> extends infer res
? Cast<res, any[]>['length']
: 0
type res1 = Mul<4, 12>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment