|
| 1 | +import type {Not} from './internal/type.d.ts'; |
| 2 | +import type {And} from './and.d.ts'; |
| 3 | +import type {Or} from './or.d.ts'; |
| 4 | + |
| 5 | +/** |
| 6 | +Returns a boolean for whether only one of two given types is true. |
| 7 | +
|
| 8 | +Use-case: Constructing complex conditional types where one single condition must be satisfied. |
| 9 | +
|
| 10 | +@example |
| 11 | +``` |
| 12 | +import type {Xor} from 'type-fest'; |
| 13 | +
|
| 14 | +type TT = Xor<true, true>; |
| 15 | +//=> false |
| 16 | +
|
| 17 | +type TF = Xor<true, false>; |
| 18 | +//=> true |
| 19 | +
|
| 20 | +type FT = Xor<false, true>; |
| 21 | +//=> true |
| 22 | +
|
| 23 | +type FF = Xor<false, false>; |
| 24 | +//=> false |
| 25 | +``` |
| 26 | +
|
| 27 | +Note: When `boolean` is passed as an argument, it is distributed into separate cases, and the final result is a union of those cases. |
| 28 | +For example, `Xor<false, boolean>` expands to `Xor<false, true> | Xor<false, false>`, which simplifies to `true | false` (i.e., `boolean`). |
| 29 | +
|
| 30 | +@example |
| 31 | +``` |
| 32 | +import type {Xor} from 'type-fest'; |
| 33 | +
|
| 34 | +type A = Xor<false, boolean>; |
| 35 | +//=> boolean |
| 36 | +
|
| 37 | +type B = Xor<boolean, false>; |
| 38 | +//=> boolean |
| 39 | +
|
| 40 | +type C = Xor<true, boolean>; |
| 41 | +//=> boolean |
| 42 | +
|
| 43 | +type D = Xor<boolean, true>; |
| 44 | +//=> boolean |
| 45 | +
|
| 46 | +type E = Xor<boolean, boolean>; |
| 47 | +//=> boolean |
| 48 | +``` |
| 49 | +
|
| 50 | +Note: If `never` is passed as an argument, it is treated as `false` and the result is computed accordingly. |
| 51 | +
|
| 52 | +@example |
| 53 | +``` |
| 54 | +import type {Xor} from 'type-fest'; |
| 55 | +
|
| 56 | +type A = Xor<true, never>; |
| 57 | +//=> true |
| 58 | +
|
| 59 | +type B = Xor<never, true>; |
| 60 | +//=> true |
| 61 | +
|
| 62 | +type C = Xor<false, never>; |
| 63 | +//=> false |
| 64 | +
|
| 65 | +type D = Xor<never, false>; |
| 66 | +//=> false |
| 67 | +
|
| 68 | +type E = Xor<boolean, never>; |
| 69 | +//=> boolean |
| 70 | +
|
| 71 | +type F = Xor<never, boolean>; |
| 72 | +//=> boolean |
| 73 | +
|
| 74 | +type G = Xor<never, never>; |
| 75 | +//=> false |
| 76 | +``` |
| 77 | +
|
| 78 | +@see {@link And} |
| 79 | +@see {@link Or} |
| 80 | +*/ |
| 81 | +export type Xor<A extends boolean, B extends boolean> = And<Or<A, B>, Not<And<A, B>>>; |
| 82 | + |
| 83 | +export {}; |
0 commit comments