Skip to content

Latest commit

 

History

History
69 lines (60 loc) · 1.82 KB

File metadata and controls

69 lines (60 loc) · 1.82 KB

Home > types-kit > IfElseIf

IfElseIf type

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
  : never

References: If, IsTuple, IfElseIf

Example

 // Expect: 6
 type Foo =  IfElseIf<[[0, 1], [null, 2], [1, 6], 7]>