diff --git a/source/conditional-pick-deep.d.ts b/source/conditional-pick-deep.d.ts index 37206ea82..40c56629b 100644 --- a/source/conditional-pick-deep.d.ts +++ b/source/conditional-pick-deep.d.ts @@ -1,6 +1,8 @@ import type {IsEqual} from './is-equal'; import type {ConditionalExcept} from './conditional-except'; import type {ConditionalSimplifyDeep} from './conditional-simplify'; +import type {UnknownRecord} from './unknown-record'; +import type {EmptyObject} from './empty-object'; /** Used to mark properties that should be excluded. @@ -95,7 +97,7 @@ export type ConditionalPickDeep< > = ConditionalSimplifyDeep extends true ? Type[Key] - : Type[Key] extends object + : Type[Key] extends UnknownRecord ? ConditionalPickDeep : typeof conditionalPickDeepSymbol; -}, (typeof conditionalPickDeepSymbol | undefined) | Record>>; +}, (typeof conditionalPickDeepSymbol | undefined) | EmptyObject>, never, UnknownRecord>; diff --git a/test-d/conditional-pick-deep.ts b/test-d/conditional-pick-deep.ts index 79f4ac0b2..f110b73f8 100644 --- a/test-d/conditional-pick-deep.ts +++ b/test-d/conditional-pick-deep.ts @@ -1,46 +1,113 @@ import {expectType} from 'tsd'; import type {ConditionalPickDeep} from '../index'; +declare class ClassA { + public a: string; +} + type Example = { - a: string; - b: string | boolean; - c: { - d: string; - e: { - f?: string; - g?: boolean; - h: string | boolean; - i: boolean | bigint; + optional?: boolean; + literal: 'foo'; + string: string; + map: Map; + set: Set; + date: Date; + array: string[]; + tuples: ['foo', 'bar']; + instanceA: ClassA; + ClassA: typeof ClassA; + function: (...args: string[]) => string; + stringOrBoolean: string | boolean; + object: { + string: string; + subObject: { + optional?: string; + string: string; }; - j: boolean; }; }; declare const stringPick: ConditionalPickDeep; -expectType<{a: string; c: {d: string}}>(stringPick); +expectType<{ + literal: 'foo'; + string: string; + object: { + string: string; + subObject: { + string: string; + }; + }; +}>(stringPick); + +declare const stringEqualityPick: ConditionalPickDeep; +expectType<{ + string: string; + object: { + string: string; + subObject: { + string: string; + }; + }; +}>(stringEqualityPick); declare const stringPickOptional: ConditionalPickDeep; -expectType<{a: string; c: {d: string; e: {f?: string}}}>(stringPickOptional); +expectType<{ + literal: 'foo'; + string: string; + object: { + string: string; + subObject: { + optional?: string | undefined; + string: string; + }; + }; +}>(stringPickOptional); declare const stringPickOptionalOnly: ConditionalPickDeep; -expectType<{c: {e: {f?: string}}}>(stringPickOptionalOnly); +expectType<{object: {subObject: {optional?: string | undefined}}}>(stringPickOptionalOnly); declare const booleanPick: ConditionalPickDeep; -expectType<{c: {e: {g?: boolean}; j: boolean}}>(booleanPick); +expectType<{optional?: boolean | undefined}>(booleanPick); declare const numberPick: ConditionalPickDeep; expectType<{}>(numberPick); declare const stringOrBooleanPick: ConditionalPickDeep; expectType<{ - a: string; - b: string | boolean; - c: { - d: string; - e: {h: string | boolean}; - j: boolean; + literal: 'foo'; + string: string; + stringOrBoolean: string | boolean; + object: { + string: string; + subObject: { + string: string; + }; }; }>(stringOrBooleanPick); declare const stringOrBooleanPickOnly: ConditionalPickDeep; -expectType<{b: string | boolean; c: {e: {h: string | boolean}}}>(stringOrBooleanPickOnly); +expectType<{stringOrBoolean: string | boolean}>(stringOrBooleanPickOnly); + +declare const arrayPick: ConditionalPickDeep; +expectType<{array: string[]; tuples: ['foo', 'bar']}>(arrayPick); + +declare const arrayEqualityPick: ConditionalPickDeep; +expectType<{array: string[]}>(arrayEqualityPick); + +declare const tuplePick: ConditionalPickDeep; +expectType<{tuples: ['foo', 'bar']}>(tuplePick); + +declare const instancePick: ConditionalPickDeep; +expectType<{instanceA: ClassA}>(instancePick); + +declare const classPick: ConditionalPickDeep; +expectType<{ClassA: typeof ClassA}>(classPick); + +declare const functionPick: ConditionalPickDeep string>; +expectType<{function: (...args: string[]) => string}>(functionPick); + +declare const mapPick: ConditionalPickDeep>; +expectType<{map: Map}>(mapPick); + +declare const setPick: ConditionalPickDeep>; +expectType<{set: Set}>(setPick);