type-plus
Version:
Provides additional types for TypeScript.
64 lines (61 loc) • 1.89 kB
text/typescript
export * from './as.js'
export * from './inspect.js'
export type { NonNull } from './NonNull.js'
export type { NonUndefined } from './NonUndefined.js'
export type { Widen } from './Widen.js'
/**
* `A` | `B` | `A & B`.
* Supports up to 4 types, and it is composable.
* This is useful when you want to compose multiple options together,
* while preserving their required field and structure.
* If the types overlaps each other, you may run into some corner cases.
* But in general usage it should work as expected.
* @example
* type A = { src: string, minify?: boolean }
* type B = { logLevel: number }
* function config(options: EitherAnd<A, B>) { }
*
* config({ logLevel: 1 })
* config({ src: 'src' })
* config({ src: 'src', minify: false })
* config({ minify: false }) // INVALID
*/
export type EitherOrBoth<A, B, C = void, D = void> = C extends void
? A | B | (A & B)
: D extends void
? A | B | C | (A & B) | (A & C) | (B & C) | (A & B & C)
:
| A
| B
| C
| D
| (A & B)
| (A & C)
| (A & D)
| (B & C)
| (B & D)
| (C & D)
| (A & B & C)
| (A & B & D)
| (A & C & D)
| (B & C & D)
| (A & B & C & D)
/**
* `A` | `B` | `A & B`.
* Supports up to 4 types, and it is composable.
* This is useful when you want to compose multiple options together,
* while preserving their required field and structure.
* If the types overlaps each other, you may run into some corner cases.
* But in general usage it should work as expected.
* @deprecated renamed to `EitherOrBoth`
* @example
* type A = { src: string, minify?: boolean }
* type B = { logLevel: number }
* function config(options: EitherAnd<A, B>) { }
*
* config({ logLevel: 1 })
* config({ src: 'src' })
* config({ src: 'src', minify: false })
* config({ minify: false }) // INVALID
*/
export type EitherAnd<A, B, C = void, D = void> = EitherOrBoth<A, B, C, D>