Skip to content

Instantly share code, notes, and snippets.

@ikasoba
Last active March 5, 2022 12:36
Show Gist options
  • Save ikasoba/bc71c2c35f31a1cf8eaaee93ed82d67c to your computer and use it in GitHub Desktop.
Save ikasoba/bc71c2c35f31a1cf8eaaee93ed82d67c to your computer and use it in GitHub Desktop.
typescriptの型で計算機
export type Down<A> = A extends [null, ...null[]]
? ((..._: A) => null) extends (_:null, ...a:infer T) => null
? T
: never
: never
export type Up<A extends null[],B extends null|null[] = null> = [...A,...(B extends null ? [B] : B)]
export type Num<N extends number,A extends null[] = []> = {
0:A,
1:Num<N,[...A,null]>
}[A["length"] extends N ? 0 : 1]
export type Add<A extends null[],N extends number,C extends null[] = []> = {
0:A,
1:Add<Up<A>,N,Up<C>>
}[
C["length"] extends N ? 0 : 1
]
export type Sub<A extends null[],N extends number,C extends null[] = []> = {
0:A,
1:Sub<Down<A>,N,Up<C>>
}[
C["length"] extends N ? 0 : 1
]
export type Mul<A extends null[],N extends number,C extends null[] = [null],FAL extends null[]=A> = {
0:A,
1:Mul<Up<A,FAL>,N,Up<C>,FAL>
}[C["length"] extends N ? 0 : 1]
export type Get<A extends null[]> = A["length"]
/*
// 50*20 = 1000
type i = Get<
Mul<Num<50>,20>
>
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment