diff --git a/types/lodash/index.d.ts b/types/lodash/index.d.ts index bb0b7b7f9d..910e29bd95 100644 --- a/types/lodash/index.d.ts +++ b/types/lodash/index.d.ts @@ -9604,7 +9604,6 @@ declare namespace _ { some( predicate?: ListIterator|DictionaryIterator|NumericDictionaryIterator|ObjectIterator ): boolean; - /** * @see _.some */ @@ -11990,7 +11989,12 @@ declare namespace _ { * * @return Returns true if value is correctly classified, else false. */ - isArray(value?: any): value is T[]; + isArray(value?: any): value is any[]; + + /** + * DEPRECATED + */ + isArray(value?: any): value is any[]; } interface LoDashImplicitWrapperBase { @@ -12059,7 +12063,22 @@ declare namespace _ { * _.isArrayLike(_.noop); * // => false */ - isArrayLike(value?: any): value is T[]; + isArrayLike(value: T & string & number): boolean; // should only match if T = any + + /** + * @see _.isArrayLike + */ + isArrayLike(value?: Function): value is never; + + /** + * @see _.isArrayLike + */ + isArrayLike(value: T | Function): value is T & { length: number }; + + /** + * DEPRECATED + */ + isArrayLike(value?: any): value is any[]; } interface LoDashImplicitWrapperBase { @@ -12102,7 +12121,22 @@ declare namespace _ { * _.isArrayLikeObject(_.noop); * // => false */ - isArrayLikeObject(value?: any): value is T[]; + isArrayLikeObject(value: T & string & number): boolean; // should only match if T = any + + /** + * @see _.isArrayLike + */ + isArrayLikeObject(value?: Function | string | boolean | number): value is never; + + /** + * @see _.isArrayLike + */ + isArrayLikeObject(value: T | Function | string | boolean | number): value is T & { length: number }; + + /** + * DEPRECATED + */ + isArrayLikeObject(value?: any): value is any[]; } interface LoDashImplicitWrapperBase { diff --git a/types/lodash/lodash-tests.ts b/types/lodash/lodash-tests.ts index d69529e0dd..a11485ca07 100644 --- a/types/lodash/lodash-tests.ts +++ b/types/lodash/lodash-tests.ts @@ -6892,18 +6892,13 @@ namespace TestisArguments { // _.isArray namespace TestIsArray { { - let value: number|string[]|boolean[] = []; + let value: number|string[]|boolean[] = any; - if (_.isArray(value)) { - let result: string[] = value; + if (_.isArray(value)) { + value; // $ExpectType boolean[] | string[] } else { - if (_.isArray(value)) { - let result: boolean[] = value; - } - else { - let result: number = value; - } + value; // $ExpectType number } } @@ -6928,13 +6923,13 @@ namespace TestIsArray { // _.isArrayBuffer namespace TestIsArrayBuffer { { - let value: ArrayBuffer|number = 0; + let value: ArrayBuffer|number = any; if (_.isArrayBuffer(value)) { - let result: ArrayBuffer = value; + value; // $ExpectType ArrayBuffer } else { - let result: number = value; + value; // $ExpectType number } } @@ -6959,18 +6954,59 @@ namespace TestIsArrayBuffer { // _.isArrayLike namespace TestIsArrayLike { { - let value: number|string[]|boolean[] = []; + let value: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] + | number | Function | { length: string } | { a: string } + = any; - if (_.isArrayLike(value)) { - let result: string[] = value; + if (_.isArrayLike(value)) { + let result: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] = value; } else { - if (_.isArrayLike(value)) { - let result: boolean[] = value; - } - else { - let result: number = value; - } + let result: number | Function | { length: string } | { a: string; } = value; + } + } + + { + let value: boolean[] = any; + + if (_.isArrayLike(value)) { + let result: boolean[] = value; + } + else { + value; // $ExpectType never + } + } + + { + let value: Function = any; + + if (_.isArrayLike(value)) { + value; // $ExpectType never + } + else { + value; // $ExpectType Function + } + } + + { + let value: { a: string } = any; + + if (_.isArrayLike(value)) { + let result: { a: string, length: number } = value; + } + else { + value; // $ExpectType { a: string; } + } + } + + { + let value: any = any; + + if (_.isArrayLike(value)) { + value; // $ExpectType any + } + else { + value; // $ExpectType any } } @@ -6995,18 +7031,59 @@ namespace TestIsArrayLike { // _.isArrayLikeObject namespace TestIsArrayLikeObject { { - let value: number|string[]|boolean[] = []; + let value: string[] | { [index: number]: boolean, length: number } | [number, boolean] + | number | string | Function | { length: string } | { a: string } + = any; - if (_.isArrayLikeObject(value)) { - let result: string[] = value; + if (_.isArrayLikeObject(value)) { + let result: string[] | { [index: number]: boolean, length: number } | [number, boolean] = value; } else { - if (_.isArrayLikeObject(value)) { - let result: boolean[] = value; - } - else { - let result: number = value; - } + let result: string | number | Function | { length: string; } | { a: string; } = value; + } + } + + { + let value: boolean[] = any; + + if (_.isArrayLikeObject(value)) { + let result: boolean[] = value; + } + else { + value; // $ExpectType never + } + } + + { + let value: string | Function = any; + + if (_.isArrayLikeObject(value)) { + value; // $ExpectType never + } + else { + value; // $ExpectType string | Function + } + } + + { + let value: { a: string } = any; + + if (_.isArrayLikeObject(value)) { + let result: { a: string, length: number } = value; + } + else { + value; // $ExpectType { a: string; } + } + } + + { + let value: any = any; + + if (_.isArrayLikeObject(value)) { + value; // $ExpectType any + } + else { + value; // $ExpectType any } }