|
1 | 1 | import {expectType} from 'tsd'; |
2 | | -import type {UnionMember, IsNever} from '../index.d.ts'; |
| 2 | +import type {UnionMember, IsNever, IsEqual} from '../index.d.ts'; |
3 | 3 |
|
4 | | -// `UnionMember` distinguishes between different modifiers. |
5 | | -type UnionType = {a: 0} | {b: 0} | {a?: 0} | {readonly a?: 0} | {readonly a: 0}; |
6 | | -expectType<true>({} as UnionMember<UnionType> extends UnionType ? true : false); |
7 | | -expectType<false>({} as UnionType extends UnionMember<UnionType> ? true : false); |
| 4 | +type UnionType = {a: 0} | {readonly a: 0}; |
| 5 | +type PickedUnionMember = UnionMember<UnionType>; |
| 6 | +expectType<true>({} as PickedUnionMember extends UnionType ? true : false); |
| 7 | +expectType<false>({} as IsEqual<UnionType, PickedUnionMember>); |
8 | 8 |
|
9 | 9 | // `never` acts as a termination condition with `IsNever`. |
10 | 10 | expectType<never>({} as UnionMember<never>); |
11 | 11 |
|
12 | 12 | expectType<unknown>({} as UnionMember<unknown>); |
13 | 13 | expectType<any>({} as UnionMember<any>); |
14 | 14 |
|
15 | | -// Ensure exactly one member is selected at a time, while covering all members in the union. |
16 | | -type UnionToTupleWithExclude<T, L = UnionMember<T>> = |
| 15 | +// `WrapMemberInTuple` ensures `UnionMember` selects exactly one member at a time. |
| 16 | +type WrapMemberInTuple<T, L = UnionMember<T>> = |
17 | 17 | IsNever<T> extends false |
18 | | - ? UnionToTupleWithExclude<Exclude<T, L>> | [L] |
| 18 | + ? WrapMemberInTuple<Exclude<T, L>> | [L] |
19 | 19 | : never; |
20 | | -expectType<[1] | [2] | [3]>({} as UnionToTupleWithExclude<1 | 2 | 3>); |
| 20 | +expectType<[1] | [2] | [3]>({} as WrapMemberInTuple<1 | 2 | 3>); |
| 21 | +expectType<['foo'] | ['bar'] | ['baz']>({} as WrapMemberInTuple<'foo' | 'bar' | 'baz'>); |
| 22 | +expectType<[1] | ['foo'] | [true] | [100n] | [null] | [undefined]>( |
| 23 | + {} as WrapMemberInTuple<1 | 'foo' | true | 100n | null | undefined>, |
| 24 | +); |
| 25 | +expectType<[{a: string}] | [{b: number}]>({} as WrapMemberInTuple<{a: string} | {b: number}>); |
0 commit comments