Last active
March 5, 2022 12:36
-
-
Save ikasoba/bc71c2c35f31a1cf8eaaee93ed82d67c to your computer and use it in GitHub Desktop.
typescriptの型で計算機
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
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