type Num = { prev?: Num; zero: boolean }; type Succ = { prev: N; zero: false }; type Pred = N["prev"] extends Num ? N["prev"] : _0; type _0 = { zero: true }; type _1 = Succ<_0>; type _2 = Succ<_1>; type _3 = Succ<_2>; type _4 = Succ<_3>; type _5 = Succ<_4>; type _6 = Succ<_5>; type _7 = Succ<_6>; type _8 = Succ<_7>; type _9 = Succ<_8>; type _10 = Succ<_9>; type Add = A extends _0 ? B : Succ, B>>; type Sub = B extends _0 ? A : Pred>>; type Multiply = B extends _0 ? _0 : Add>>; type Fib = N extends _0 ? N : N extends _1 ? N : Add>, Fib>>; type Result = Add<_2, _2>;