diff --git a/source/conditional-pick-deep.d.ts b/source/conditional-pick-deep.d.ts index e6f12798a..dbc2a7da3 100644 --- a/source/conditional-pick-deep.d.ts +++ b/source/conditional-pick-deep.d.ts @@ -74,7 +74,7 @@ type BooleanPick = ConditionalPickDeep; //=> {c: {e: {g?: boolean}; j: boolean}} type NumberPick = ConditionalPickDeep; -//=> {} +//=> never type StringOrBooleanPick = ConditionalPickDeep; //=> { @@ -99,11 +99,13 @@ export type ConditionalPickDeep< Type, Condition, Options extends ConditionalPickDeepOptions = {}, -> = _ConditionalPickDeep< +> = _NeverIfEmpty<_ConditionalPickDeep< Type, Condition, ApplyDefaultOptions ->; +>>; + +type _NeverIfEmpty = Type extends EmptyObject ? never : Type; type _ConditionalPickDeep< Type, diff --git a/test-d/conditional-pick-deep.ts b/test-d/conditional-pick-deep.ts index ba18532e3..29d429b45 100644 --- a/test-d/conditional-pick-deep.ts +++ b/test-d/conditional-pick-deep.ts @@ -102,7 +102,15 @@ declare const emptyPick: ConditionalPickDeep; expectType<{never: never}>(emptyPick); declare const emptyEqualityPick: ConditionalPickDeep; -expectType<{}>(emptyEqualityPick); +expectType(emptyEqualityPick); + +// Returns `never` when no keys match the condition +declare const noMatchingKeys: ConditionalPickDeep<{a: string; b: number}, boolean>; +expectType(noMatchingKeys); + +// Union with no common properties +declare const unionNoCommon: ConditionalPickDeep<{a: string} | {b: string}, string>; +expectType<{a: string} | {b: string}>(unionNoCommon); declare const stringOrBooleanPick: ConditionalPickDeep; expectType<{