|
| 1 | +import {expectType} from 'tsd'; |
| 2 | +import type {UnionMember, IsNever, IsEqual} from '../index.d.ts'; |
| 3 | + |
| 4 | +expectType<false>({} as boolean extends UnionMember<boolean> ? true : false); |
| 5 | +expectType<false>({} as (1 | 'foo' | 'bar') extends UnionMember<1 | 'foo' | 'bar'> ? true : false); |
| 6 | +expectType<false>({} as ({foo: string} | {bar: number}) extends UnionMember<{foo: string} | {bar: number}> ? true : false); |
| 7 | + |
| 8 | +expectType<number>({} as UnionMember<number>); |
| 9 | +expectType<string>({} as UnionMember<string>); |
| 10 | +expectType<bigint>({} as UnionMember<bigint>); |
| 11 | +expectType<true>({} as UnionMember<true>); |
| 12 | +expectType<false>({} as UnionMember<false>); |
| 13 | +expectType<null>({} as any as UnionMember<null>); |
| 14 | +expectType<undefined>({} as any as UnionMember<undefined>); |
| 15 | + |
| 16 | +expectType<never>({} as UnionMember<never>); |
| 17 | +expectType<unknown>({} as UnionMember<unknown>); |
| 18 | +expectType<any>({} as UnionMember<any>); |
| 19 | + |
| 20 | +// `WrapMemberInTuple` ensures `UnionMember` selects exactly one member at a time. |
| 21 | +type WrapMemberInTuple<T, L = UnionMember<T>> = |
| 22 | + IsNever<T> extends false |
| 23 | + ? WrapMemberInTuple<Exclude<T, L>> | [L] |
| 24 | + : never; |
| 25 | +expectType<[1] | [2] | [3]>({} as WrapMemberInTuple<1 | 2 | 3>); |
| 26 | +expectType<['foo'] | ['bar'] | ['baz']>({} as WrapMemberInTuple<'foo' | 'bar' | 'baz'>); |
| 27 | +expectType<[1] | ['foo'] | [true] | [100n] | [null] | [undefined]>( |
| 28 | + {} as WrapMemberInTuple<1 | 'foo' | true | 100n | null | undefined>, |
| 29 | +); |
| 30 | +expectType<[{a: string}] | [{b: number}]>({} as WrapMemberInTuple<{a: string} | {b: number}>); |
| 31 | + |
| 32 | +type UnionType = {a: 0} | {readonly a: 0}; |
| 33 | +type PickedUnionMember = UnionMember<UnionType>; |
| 34 | +// We can't use `UnionType extends PickedUnionMember ? true : false` for testing here, |
| 35 | +// because that would always be `true` as `UnionType` extends both of its members individually. |
| 36 | +expectType<false>({} as IsEqual<UnionType, PickedUnionMember>); |
0 commit comments