If/Else if for types.
Signature:
export type IfElseIf<
A extends readonly // if/else if/else
[
[Condition: unknown, Result: unknown],
...[Condition: unknown, Result: unknown][],
unknown,
],
> = A extends readonly [
infer IfExpression,
...infer ElseIfExpressions,
infer ElseResult,
]
? IfExpression extends [infer IfCondition, infer IfResult]
? If<
IfCondition,
IfResult,
If<
IsTuple<ElseIfExpressions>,
ElseIfExpressions extends [
[infer ElseIfCondition, infer ElseIfResult],
...infer OtherElseIfExpressions,
]
? OtherElseIfExpressions extends [
Condition: unknown,
Result: unknown,
][]
? IfElseIf<
[
[ElseIfCondition, ElseIfResult],
...OtherElseIfExpressions,
ElseResult,
]
>
: If<ElseIfCondition, ElseIfResult, ElseResult>
: ElseResult,
// empty array or array
ElseIfExpressions extends [
infer ElseIfCondition,
infer ElseIfResult,
][]
? If<ElseIfCondition, ElseIfResult, ElseResult>
: ElseResult
>
>
: // feedback
ElseResult
: neverReferences: If, IsTuple, IfElseIf
// Expect: 6
type Foo = IfElseIf<[[0, 1], [null, 2], [1, 6], 7]>