Skip to content

Commit cf20eab

Browse files
committed
[lodash] fix _.get return type cannot refer to correct type and default type in nested object with optional fields
1 parent 8f21265 commit cf20eab

2 files changed

Lines changed: 49 additions & 6 deletions

File tree

types/lodash/common/object.d.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,35 +1140,35 @@ declare module "../index" {
11401140
/**
11411141
* @see _.get
11421142
*/
1143-
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1]>(object: TObject | null | undefined, path: [TKey1, TKey2]): TObject[TKey1][TKey2] | undefined;
1143+
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof NonNullable<TObject[TKey1]>>(object: TObject | null | undefined, path: [TKey1, TKey2]): NonNullable<TObject[TKey1]>[TKey2] | undefined;
11441144
/**
11451145
* @see _.get
11461146
*/
1147-
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TDefault>(object: TObject | null | undefined, path: [TKey1, TKey2], defaultValue: TDefault): Exclude<TObject[TKey1][TKey2], undefined> | TDefault;
1147+
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof NonNullable<TObject[TKey1]>, TDefault>(object: TObject | null | undefined, path: [TKey1, TKey2], defaultValue: TDefault): Exclude<NonNullable<TObject[TKey1]>[TKey2], undefined> | TDefault;
11481148
/**
11491149
* @see _.get
11501150
*/
11511151
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TKey3 extends keyof TObject[TKey1][TKey2]>(object: TObject, path: [TKey1, TKey2, TKey3]): TObject[TKey1][TKey2][TKey3];
11521152
/**
11531153
* @see _.get
11541154
*/
1155-
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TKey3 extends keyof TObject[TKey1][TKey2]>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3]): TObject[TKey1][TKey2][TKey3] | undefined;
1155+
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof NonNullable<TObject[TKey1]>, TKey3 extends keyof NonNullable<NonNullable<TObject[TKey1]>[TKey2]>>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3]): NonNullable<NonNullable<TObject[TKey1]>[TKey2]>[TKey3] | undefined;
11561156
/**
11571157
* @see _.get
11581158
*/
1159-
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TKey3 extends keyof TObject[TKey1][TKey2], TDefault>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3], defaultValue: TDefault): Exclude<TObject[TKey1][TKey2][TKey3], undefined> | TDefault;
1159+
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof NonNullable<TObject[TKey1]>, TKey3 extends keyof NonNullable<NonNullable<TObject[TKey1]>[TKey2]>, TDefault>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3], defaultValue: TDefault): Exclude<NonNullable<NonNullable<TObject[TKey1]>[TKey2]>[TKey3], undefined> | TDefault;
11601160
/**
11611161
* @see _.get
11621162
*/
11631163
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TKey3 extends keyof TObject[TKey1][TKey2], TKey4 extends keyof TObject[TKey1][TKey2][TKey3]>(object: TObject, path: [TKey1, TKey2, TKey3, TKey4]): TObject[TKey1][TKey2][TKey3][TKey4];
11641164
/**
11651165
* @see _.get
11661166
*/
1167-
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TKey3 extends keyof TObject[TKey1][TKey2], TKey4 extends keyof TObject[TKey1][TKey2][TKey3]>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3, TKey4]): TObject[TKey1][TKey2][TKey3][TKey4] | undefined;
1167+
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof NonNullable<TObject[TKey1]>, TKey3 extends keyof NonNullable<NonNullable<TObject[TKey1]>[TKey2]>, TKey4 extends keyof NonNullable<NonNullable<NonNullable<TObject[TKey1]>[TKey2]>[TKey3]>>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3, TKey4]): NonNullable<NonNullable<NonNullable<TObject[TKey1]>[TKey2]>[TKey3]>[TKey4] | undefined;
11681168
/**
11691169
* @see _.get
11701170
*/
1171-
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof TObject[TKey1], TKey3 extends keyof TObject[TKey1][TKey2], TKey4 extends keyof TObject[TKey1][TKey2][TKey3], TDefault>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3, TKey4], defaultValue: TDefault): Exclude<TObject[TKey1][TKey2][TKey3][TKey4], undefined> | TDefault;
1171+
get<TObject extends object, TKey1 extends keyof TObject, TKey2 extends keyof NonNullable<TObject[TKey1]>, TKey3 extends keyof NonNullable<NonNullable<TObject[TKey1]>[TKey2]>, TKey4 extends keyof NonNullable<NonNullable<NonNullable<TObject[TKey1]>[TKey2]>[TKey3]>, TDefault>(object: TObject | null | undefined, path: [TKey1, TKey2, TKey3, TKey4], defaultValue: TDefault): Exclude<NonNullable<NonNullable<NonNullable<TObject[TKey1]>[TKey2]>[TKey3]>[TKey4], undefined> | TDefault;
11721172
/**
11731173
* @see _.get
11741174
*/

types/lodash/lodash-tests.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5357,6 +5357,40 @@ fp.now(); // $ExpectType number
53575357
const value: string | undefined = anything;
53585358
const defaultValue: boolean = anything;
53595359
const objectWithOptionalField: { a?: boolean } = anything;
5360+
const nestedObjectWithOptionalField: {
5361+
foo?: {
5362+
bar: string;
5363+
} | null;
5364+
nested?: {
5365+
with?: {
5366+
optional: string | null;
5367+
} | null;
5368+
} | null;
5369+
four?: {
5370+
levels?: {
5371+
deep?: {
5372+
value?: number;
5373+
} | null;
5374+
} | null;
5375+
} | null;
5376+
} = anything;
5377+
const nestedObject: {
5378+
foo: {
5379+
bar: string;
5380+
};
5381+
nested: {
5382+
with: {
5383+
optional: string | null;
5384+
};
5385+
};
5386+
four: {
5387+
levels: {
5388+
deep: {
5389+
value: number;
5390+
};
5391+
};
5392+
};
5393+
} = anything;
53605394

53615395
const anyNumber: number = anything;
53625396
const arrayOfNumbers: number[] = anything;
@@ -5416,6 +5450,15 @@ fp.now(); // $ExpectType number
54165450
_.get(complexValue, '0'); // $ExpectType 'Value4' | number
54175451
_.get(complexValue, '1'); // $ExpectType undefined | number
54185452
_.get(complexValue, 'length'); // $ExpectType 'Value5' | number
5453+
_.get(nestedObject, ['foo', 'bar']); // $ExpectType string
5454+
_.get(nestedObject, ['nested', 'with', 'optional']); // $ExpectType string | null
5455+
_.get(nestedObject, ['four', 'levels', 'deep', 'value']); // $ExpectType number
5456+
_.get(nestedObjectWithOptionalField, ['foo', 'bar'], defaultValue); // $ExpectType string | boolean
5457+
_.get(nestedObjectWithOptionalField, ['nested', 'with', 'optional'], defaultValue); // $ExpectType string | null | boolean
5458+
_.get(nestedObjectWithOptionalField, ['four', 'levels', 'deep', 'value'], defaultValue); // $ExpectType number | boolean
5459+
_.get(nestedObjectWithOptionalField, ['foo', 'bar']); // $ExpectType string | undefined
5460+
_.get(nestedObjectWithOptionalField, ['nested', 'with', 'optional']); // $ExpectType string | null | undefined
5461+
_.get(nestedObjectWithOptionalField, ['four', 'levels', 'deep', 'value']); // $ExpectType number | undefined
54195462

54205463
_("abc").get(1); // $ExpectType string
54215464
_({ a: false }).get("a"); // $ExpectType boolean

0 commit comments

Comments
 (0)