|
| 1 | +import {expectType} from 'tsd'; |
| 2 | +import {expectTypeOf} from 'expect-type'; |
| 3 | +import type {RequiredDeep} from '../index'; |
| 4 | + |
| 5 | +type Foo = { |
| 6 | + baz?: string | undefined; |
| 7 | + bar?: { |
| 8 | + function?: ((...args: any[]) => void) | undefined; |
| 9 | + functionFixedArity?: ((arg1: unknown, arg2: unknown) => void); |
| 10 | + functionWithOverload?: { |
| 11 | + (arg: number): string; |
| 12 | + (arg1: string, arg2: number): number; |
| 13 | + }; |
| 14 | + namespace?: { |
| 15 | + (arg: number): string; |
| 16 | + key: string | undefined; |
| 17 | + }; |
| 18 | + namespaceWithOverload: { |
| 19 | + (arg: number): string; |
| 20 | + (arg1: string, arg2: number): number; |
| 21 | + key: string | undefined; |
| 22 | + }; |
| 23 | + object?: {key?: 'value'} | undefined; |
| 24 | + string?: string | undefined; |
| 25 | + number?: number | undefined; |
| 26 | + boolean?: false | undefined; |
| 27 | + date?: Date | undefined; |
| 28 | + regexp?: RegExp | undefined; |
| 29 | + symbol?: Symbol | undefined; |
| 30 | + null?: null | undefined; |
| 31 | + undefined?: undefined; |
| 32 | + map?: Map<string | undefined, string | undefined>; |
| 33 | + set?: Set<string | undefined>; |
| 34 | + array?: Array<string | undefined>; |
| 35 | + tuple?: ['foo' | undefined] | undefined; |
| 36 | + readonlyMap?: ReadonlyMap<string | undefined, string | undefined>; |
| 37 | + readonlySet?: ReadonlySet<string | undefined>; |
| 38 | + readonlyArray?: ReadonlyArray<string | undefined>; |
| 39 | + readonlyTuple?: readonly ['foo' | undefined] | undefined; |
| 40 | + weakMap?: WeakMap<{key: string | undefined}, string | undefined>; |
| 41 | + weakSet?: WeakSet<{key: string | undefined}>; |
| 42 | + promise?: Promise<string | undefined>; |
| 43 | + }; |
| 44 | +}; |
| 45 | + |
| 46 | +type FooRequired = { |
| 47 | + baz: string; |
| 48 | + bar: { |
| 49 | + function: (...args: any[]) => void; |
| 50 | + functionFixedArity: (arg1: unknown, arg2: unknown) => void; |
| 51 | + functionWithOverload: { |
| 52 | + (arg: number): string; |
| 53 | + (arg1: string, arg2: number): number; |
| 54 | + }; |
| 55 | + namespace: { |
| 56 | + (arg: number): string; |
| 57 | + key: string; |
| 58 | + }; |
| 59 | + namespaceWithOverload: { |
| 60 | + (arg: number): string; |
| 61 | + (arg1: string, arg2: number): number; |
| 62 | + key: string; |
| 63 | + }; |
| 64 | + object: {key: 'value'}; |
| 65 | + string: string; |
| 66 | + number: number; |
| 67 | + boolean: false; |
| 68 | + date: Date; |
| 69 | + regexp: RegExp; |
| 70 | + symbol: Symbol; |
| 71 | + null: null; |
| 72 | + undefined: never; |
| 73 | + map: Map<string, string>; |
| 74 | + set: Set<string>; |
| 75 | + array: string[]; |
| 76 | + tuple: ['foo']; |
| 77 | + readonlyMap: ReadonlyMap<string, string>; |
| 78 | + readonlySet: ReadonlySet<string>; |
| 79 | + readonlyArray: readonly string[]; |
| 80 | + readonlyTuple: readonly ['foo']; |
| 81 | + weakMap: WeakMap<{key: string}, string>; |
| 82 | + weakSet: WeakSet<{key: string}>; |
| 83 | + promise: Promise<string>; |
| 84 | + }; |
| 85 | +}; |
| 86 | + |
| 87 | +type FooBar = Exclude<Foo['bar'], undefined>; |
| 88 | +type FooRequiredBar = FooRequired['bar']; |
| 89 | + |
| 90 | +expectTypeOf<RequiredDeep<Foo>>().toEqualTypeOf<FooRequired>(); |
| 91 | +expectTypeOf<RequiredDeep<FooBar['function']>>().toEqualTypeOf<FooRequiredBar['function']>(); |
| 92 | +expectTypeOf<RequiredDeep<FooBar['functionFixedArity']>>().toEqualTypeOf<FooRequiredBar['functionFixedArity']>(); |
| 93 | +expectTypeOf<RequiredDeep<FooBar['object']>>().toEqualTypeOf<FooRequiredBar['object']>(); |
| 94 | +expectTypeOf<RequiredDeep<FooBar['string']>>().toEqualTypeOf<FooRequiredBar['string']>(); |
| 95 | +expectTypeOf<RequiredDeep<FooBar['number']>>().toEqualTypeOf<FooRequiredBar['number']>(); |
| 96 | +expectTypeOf<RequiredDeep<FooBar['boolean']>>().toEqualTypeOf<FooRequiredBar['boolean']>(); |
| 97 | +expectTypeOf<RequiredDeep<FooBar['date']>>().toEqualTypeOf<FooRequiredBar['date']>(); |
| 98 | +expectTypeOf<RequiredDeep<FooBar['regexp']>>().toEqualTypeOf<FooRequiredBar['regexp']>(); |
| 99 | +expectTypeOf<RequiredDeep<FooBar['map']>>().toEqualTypeOf<FooRequiredBar['map']>(); |
| 100 | +expectTypeOf<RequiredDeep<FooBar['set']>>().toEqualTypeOf<FooRequiredBar['set']>(); |
| 101 | +expectTypeOf<RequiredDeep<FooBar['array']>>().toEqualTypeOf<FooRequiredBar['array']>(); |
| 102 | +expectTypeOf<RequiredDeep<FooBar['tuple']>>().toEqualTypeOf<FooRequiredBar['tuple']>(); |
| 103 | +expectTypeOf<RequiredDeep<FooBar['readonlyMap']>>().toEqualTypeOf<FooRequiredBar['readonlyMap']>(); |
| 104 | +expectTypeOf<RequiredDeep<FooBar['readonlySet']>>().toEqualTypeOf<FooRequiredBar['readonlySet']>(); |
| 105 | +expectTypeOf<RequiredDeep<FooBar['readonlyArray']>>().toEqualTypeOf<FooRequiredBar['readonlyArray']>(); |
| 106 | +expectTypeOf<RequiredDeep<FooBar['readonlyTuple']>>().toEqualTypeOf<FooRequiredBar['readonlyTuple']>(); |
| 107 | +expectTypeOf<RequiredDeep<FooBar['weakMap']>>().toEqualTypeOf<FooRequiredBar['weakMap']>(); |
| 108 | +expectTypeOf<RequiredDeep<FooBar['weakSet']>>().toEqualTypeOf<FooRequiredBar['weakSet']>(); |
| 109 | +expectTypeOf<RequiredDeep<FooBar['promise']>>().toEqualTypeOf<FooRequiredBar['promise']>(); |
| 110 | +expectTypeOf<RequiredDeep<FooBar['namespace']>>().toEqualTypeOf<FooRequiredBar['namespace']>(); |
| 111 | +expectTypeOf<RequiredDeep<FooBar['undefined']>>().toBeNever(); |
| 112 | +expectTypeOf<RequiredDeep<FooBar['null']>>().toEqualTypeOf<FooRequiredBar['null']>(); |
| 113 | + |
| 114 | +// These currently need to be left alone due to TypeScript limitations. |
| 115 | +// @see https://github.com/microsoft/TypeScript/issues/29732 |
| 116 | +expectType<string>(({} as unknown as RequiredDeep<FooBar['functionWithOverload']>)(0)); |
| 117 | +expectType<number>(({} as unknown as RequiredDeep<FooBar['functionWithOverload']>)('foo', 0)); |
| 118 | +expectType<string>(({} as unknown as RequiredDeep<FooBar['namespaceWithOverload']>)(0)); |
| 119 | +expectType<number>(({} as unknown as RequiredDeep<FooBar['namespaceWithOverload']>)('foo', 0)); |
0 commit comments