Fixed isArray type guards (#16077)

This commit is contained in:
AJ Richardson
2017-06-23 23:16:05 -04:00
parent 15dcb45606
commit 4e5add2f77
2 changed files with 145 additions and 34 deletions
+38 -4
View File
@@ -9604,7 +9604,6 @@ declare namespace _ {
some<TResult>(
predicate?: ListIterator<TResult, boolean>|DictionaryIterator<TResult, boolean>|NumericDictionaryIterator<T, boolean>|ObjectIterator<any, boolean>
): boolean;
/**
* @see _.some
*/
@@ -11990,7 +11989,12 @@ declare namespace _ {
*
* @return Returns true if value is correctly classified, else false.
*/
isArray<T>(value?: any): value is T[];
isArray(value?: any): value is any[];
/**
* DEPRECATED
*/
isArray<T>(value?: any): value is any[];
}
interface LoDashImplicitWrapperBase<T, TWrapper> {
@@ -12059,7 +12063,22 @@ declare namespace _ {
* _.isArrayLike(_.noop);
* // => false
*/
isArrayLike<T>(value?: any): value is T[];
isArrayLike<T>(value: T & string & number): boolean; // should only match if T = any
/**
* @see _.isArrayLike
*/
isArrayLike(value?: Function): value is never;
/**
* @see _.isArrayLike
*/
isArrayLike<T>(value: T | Function): value is T & { length: number };
/**
* DEPRECATED
*/
isArrayLike<T>(value?: any): value is any[];
}
interface LoDashImplicitWrapperBase<T, TWrapper> {
@@ -12102,7 +12121,22 @@ declare namespace _ {
* _.isArrayLikeObject(_.noop);
* // => false
*/
isArrayLikeObject<T>(value?: any): value is T[];
isArrayLikeObject<T>(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<T>(value: T | Function | string | boolean | number): value is T & { length: number };
/**
* DEPRECATED
*/
isArrayLikeObject<T>(value?: any): value is any[];
}
interface LoDashImplicitWrapperBase<T, TWrapper> {
+107 -30
View File
@@ -6892,18 +6892,13 @@ namespace TestisArguments {
// _.isArray
namespace TestIsArray {
{
let value: number|string[]|boolean[] = [];
let value: number|string[]|boolean[] = any;
if (_.isArray<string>(value)) {
let result: string[] = value;
if (_.isArray(value)) {
value; // $ExpectType boolean[] | string[]
}
else {
if (_.isArray<boolean>(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<string>(value)) {
let result: string[] = value;
if (_.isArrayLike(value)) {
let result: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] = value;
}
else {
if (_.isArrayLike<boolean>(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<string>(value)) {
let result: string[] = value;
if (_.isArrayLikeObject(value)) {
let result: string[] | { [index: number]: boolean, length: number } | [number, boolean] = value;
}
else {
if (_.isArrayLikeObject<boolean>(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
}
}