type-plus
Version:
Provides additional types for TypeScript.
43 lines • 1.88 kB
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>;
//# sourceMappingURL=index.d.ts.map