Merge pull request #3781 from asger-semmle/js/deprecate-type-member-lookup

Approved by erik-krogh
This commit is contained in:
semmle-qlci
2020-06-25 14:56:17 +01:00
committed by GitHub
23 changed files with 106 additions and 208 deletions

View File

@@ -98,3 +98,4 @@ The following low-precision queries are no longer run by default on LGTM (their
- `ParameterNode.asExpr()` and `.getAstNode()` now gets the parameter's AST node, whereas previously it had no result.
- `Expr.flow()` now has a more meaningful result for destructuring patterns. Previously this node was disconnected from the data flow graph. Now it represents the values being destructured by the pattern.
* The global data-flow and taint-tracking libraries now model indirect parameter accesses through the `arguments` object in some cases, which may lead to additional results from some of the security queries, particularly "Prototype pollution in utility function".
* The predicates `Type.getProperty()` and variants of `Type.getMethod()` have been deprecated due to lack of use-cases. Looking up a named property of a static type is no longer supported, favoring faster extraction times instead.

View File

@@ -875,21 +875,23 @@ export class TypeTable {
}
/**
* Returns the properties of the given type, or `null` if the properties of this
* type could not be computed.
* Returns the properties to extract for the given type or `null` if nothing should be extracted.
*
* For performance reasons we only extract properties needed to recognize promise types at the QL
* level.
*/
private tryGetProperties(type: ts.Type) {
// Workaround for https://github.com/Microsoft/TypeScript/issues/30845
// Should be safe to remove once that has been fixed.
try {
return type.getProperties();
} catch (e) {
return null;
private getPropertiesToExtract(type: ts.Type) {
if (this.getSelfType(type) === type) {
let thenSymbol = this.typeChecker.getPropertyOfType(type, "then");
if (thenSymbol != null) {
return [thenSymbol];
}
}
return null;
}
private extractProperties(type: ts.Type, id: number) {
let props = this.tryGetProperties(type);
let props = this.getPropertiesToExtract(type);
if (props == null) return;
for (let symbol of props) {
let propertyType = this.tryGetTypeOfSymbol(symbol);

View File

@@ -1649,11 +1649,9 @@ class Type extends @type {
Type getChild(int i) { type_child(result, this, i) }
/**
* Gets the type of the given property of this type.
*
* Note that this does not account for properties implied by index signatures.
* DEPRECATED. Property lookup on types is no longer supported.
*/
Type getProperty(string name) { type_property(this, name, result) }
deprecated Type getProperty(string name) { none() }
/**
* Gets the type of the string index signature on this type,
@@ -1758,33 +1756,19 @@ class Type extends @type {
int getNumConstructorSignature() { result = count(getAConstructorSignature()) }
/**
* Gets the last signature of the method of the given name.
*
* For overloaded methods, this is the most general version of the its
* signature, which covers all cases, but with less precision than the
* overload signatures.
*
* Use `getAMethodOverload` to get any of its overload signatures.
* DEPRECATED. Method lookup on types is no longer supported.
*/
FunctionCallSignatureType getMethod(string name) {
result = getProperty(name).getLastFunctionSignature()
}
deprecated FunctionCallSignatureType getMethod(string name) { none() }
/**
* Gets the `n`th overload signature of the given method.
* DEPRECATED. Method lookup on types is no longer supported.
*/
FunctionCallSignatureType getMethodOverload(string name, int n) {
result = getProperty(name).getFunctionSignature(n)
}
deprecated FunctionCallSignatureType getMethodOverload(string name, int n) { none() }
/**
* Gets a signature of the method of the given name.
*
* Overloaded methods have multiple signatures.
* DEPRECATED. Method lookup on types is no longer supported.
*/
FunctionCallSignatureType getAMethodOverload(string name) {
result = getProperty(name).getAFunctionSignature()
}
deprecated FunctionCallSignatureType getAMethodOverload(string name) { none() }
/**
* Repeatedly unfolds union and intersection types and gets any of the underlying types,
@@ -2638,10 +2622,11 @@ private class PromiseTypeName extends TypeName {
name.matches("%Deferred")
) and
// The `then` method should take a callback, taking an argument of type `T`.
exists(TypeReference self | self = getType() |
exists(TypeReference self, Type thenMethod | self = getType() |
self.getNumTypeArgument() = 1 and
self
.getAMethodOverload("then")
type_property(self, "then", thenMethod) and
thenMethod
.getAFunctionSignature()
.getParameter(0)
.unfold()
.getAFunctionSignature()

View File

@@ -1,20 +1,5 @@
| (T \| ConcatArray<T>)[] | `T \| ConcatArray<T>` |
| (number \| ConcatArray<number>)[] | `number \| ConcatArray<number>` |
| (number[] \| ConcatArray<number[]>)[] | `number[] \| ConcatArray<number[]>` |
| (string \| number \| ConcatArray<string \| number>)[] | `string \| number \| ConcatArray<string \| number>` |
| (string \| number)[] | `string \| number` |
| ConcatArray<T>[] | `ConcatArray<T>` |
| ConcatArray<number>[] | `ConcatArray<number>` |
| ConcatArray<number[]>[] | `ConcatArray<number[]>` |
| ConcatArray<string \| number>[] | `ConcatArray<string \| number>` |
| S[] | `S` |
| T[] | `T` |
| U[] | `U` |
| [number, string] | `string \| number` |
| any[] | `any` |
| number[] | `number` |
| number[][] | `number[]` |
| readonly T[] | `T` |
| readonly number[] | `number` |
| readonly number[][] | `number[]` |
| string[] | `string` |

View File

@@ -1,22 +1,7 @@
| (T \| ConcatArray<T>)[] | T \| ConcatArray<T> |
| (number \| ConcatArray<number>)[] | number \| ConcatArray<number> |
| (number[] \| ConcatArray<number[]>)[] | number[] \| ConcatArray<number[]> |
| (string \| number \| ConcatArray<string \| number>)[] | string \| number \| ConcatArray<string \| number> |
| (string \| number)[] | string \| number |
| ConcatArray<T>[] | ConcatArray<T> |
| ConcatArray<number>[] | ConcatArray<number> |
| ConcatArray<number[]>[] | ConcatArray<number[]> |
| ConcatArray<string \| number>[] | ConcatArray<string \| number> |
| NumberIndexable | object |
| S[] | S |
| T[] | T |
| U[] | U |
| [number, string] | string \| number |
| any[] | any |
| number[] | number |
| number[][] | number[] |
| readonly T[] | T |
| readonly number[] | number |
| readonly number[][] | number[] |
| string | string |
| string[] | string |

View File

@@ -1 +0,0 @@
| [number, string] | (string \| number)[] |

View File

@@ -13,4 +13,3 @@
| IMulti | IGenericBase |
| IStringSub | IGenericBase |
| ISub | IBase |
| RegExpMatchArray | Array |

View File

@@ -7,7 +7,6 @@
| CImplementsString | CImplementsString |
| CStringSub | CStringSub |
| CSub | CSub |
| CollatorOptions | CollatorOptions |
| IBase | IBase |
| IEmpty | IEmpty |
| IEmptySub | IEmptySub |
@@ -16,6 +15,3 @@
| IMulti | IMulti<T> |
| IStringSub | IStringSub |
| ISub | ISub |
| NumberFormatOptions | NumberFormatOptions |
| RegExp | RegExp |
| RegExpMatchArray | RegExpMatchArray |

View File

@@ -108,51 +108,24 @@ test_FunctionCallSig
| tst.ts:63:3:63:23 | method2 ... ing[]); | (y: string[]): any |
| tst.ts:64:3:64:21 | method3(y: string); | (y: string): any |
test_getRestParameterType
| (...items: (string \| ConcatArray<string>)[]): T[] | string \| ConcatArray<string> |
| (...items: ConcatArray<string>[]): T[] | ConcatArray<string> |
| (...items: string[]): number | string |
| (...strings: string[]): string | string |
| (...y: string[]): any | string |
| (start: number, deleteCount: number, ...items: string[]): T[] | string |
| (substring: string, ...args: any[]): string | any |
| (x: number, ...y: string[]): any | string |
| new (...y: string[]): any | string |
| new (x: number, ...y: string[]): any | string |
test_getRestParameterArray
| (...items: (string \| ConcatArray<string>)[]): T[] | (string \| ConcatArray<string>)[] |
| (...items: ConcatArray<string>[]): T[] | ConcatArray<string>[] |
| (...items: string[]): number | string[] |
| (...strings: string[]): string | string[] |
| (...y: string[]): any | string[] |
| (start: number, deleteCount: number, ...items: string[]): T[] | string[] |
| (substring: string, ...args: any[]): string | any[] |
| (x: number, ...y: string[]): any | string[] |
| new (...y: string[]): any | string[] |
| new (x: number, ...y: string[]): any | string[] |
test_RestSig_getParameter
| (...items: (string \| ConcatArray<string>)[]): T[] | 0 | items | string \| ConcatArray<string> |
| (...items: ConcatArray<string>[]): T[] | 0 | items | ConcatArray<string> |
| (...items: string[]): number | 0 | items | string |
| (...strings: string[]): string | 0 | strings | string |
| (...y: string[]): any | 0 | y | string |
| (start: number, deleteCount: number, ...items: string[]): T[] | 0 | start | number |
| (start: number, deleteCount: number, ...items: string[]): T[] | 1 | deleteCount | number |
| (start: number, deleteCount: number, ...items: string[]): T[] | 2 | items | string |
| (substring: string, ...args: any[]): string | 0 | substring | string |
| (substring: string, ...args: any[]): string | 1 | args | any |
| (x: number, ...y: string[]): any | 0 | x | number |
| (x: number, ...y: string[]): any | 1 | y | string |
| new (...y: string[]): any | 0 | y | string |
| new (x: number, ...y: string[]): any | 0 | x | number |
| new (x: number, ...y: string[]): any | 1 | y | string |
test_RestSig_numRequiredParams
| (...items: (string \| ConcatArray<string>)[]): T[] | 0 |
| (...items: ConcatArray<string>[]): T[] | 0 |
| (...items: string[]): number | 0 |
| (...strings: string[]): string | 0 |
| (...y: string[]): any | 0 |
| (start: number, deleteCount: number, ...items: string[]): T[] | 2 |
| (substring: string, ...args: any[]): string | 1 |
| (x: number, ...y: string[]): any | 1 |
| new (...y: string[]): any | 0 |
| new (x: number, ...y: string[]): any | 1 |

View File

@@ -1,23 +0,0 @@
| Box in library-tests/TypeScript/ExpansiveTypes/shared_non_expansive.ts | has no properties |
| Box in library-tests/TypeScript/ExpansiveTypes/through_non_expansive.ts | has no properties |
| C in library-tests/TypeScript/ExpansiveTypes/expansive_class.ts | has no properties |
| Expand in library-tests/TypeScript/ExpansiveTypes/through_non_expansive.ts | has no properties |
| ExpandUsingObjectLiteral in library-tests/TypeScript/ExpansiveTypes/expansive_object_literal.ts | has no properties |
| Expansive in library-tests/TypeScript/ExpansiveTypes/leading_into_expansion.ts | has no properties |
| Expansive in library-tests/TypeScript/ExpansiveTypes/simple.ts | has no properties |
| ExpansiveA in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has no properties |
| ExpansiveA in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has no properties |
| ExpansiveB in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has no properties |
| ExpansiveB in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has no properties |
| ExpansiveByInference in library-tests/TypeScript/ExpansiveTypes/expansive_by_inference.ts | has no properties |
| ExpansiveC in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has no properties |
| ExpansiveC in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has no properties |
| ExpansiveConstructSignature in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has no properties |
| ExpansiveD in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has no properties |
| ExpansiveD in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has no properties |
| ExpansiveFunctionType in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has no properties |
| ExpansiveMethod in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has no properties |
| ExpansiveParameter in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has no properties |
| ExpansiveSignature in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has no properties |
| ExpansiveSignatureTypeBound in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has no properties |
| ExpansiveX in library-tests/TypeScript/ExpansiveTypes/used_from_expansion.ts | has no properties |

View File

@@ -1,11 +0,0 @@
import javascript
from TypeReference type
where
not exists(type.getProperty(_)) and
(
exists(type.getADefinition().(ClassOrInterface).getAField())
or
exists(type.getADefinition().(ClassOrInterface).getAMethod())
)
select type.getTypeName(), "has no properties"

View File

@@ -1,31 +0,0 @@
| After in library-tests/TypeScript/ExpansiveTypes/leading_into_expansion.ts | has properties |
| AfterX in library-tests/TypeScript/ExpansiveTypes/used_from_expansion.ts | has properties |
| Array in global scope | has properties |
| Before in library-tests/TypeScript/ExpansiveTypes/leading_into_expansion.ts | has properties |
| BeforeX in library-tests/TypeScript/ExpansiveTypes/used_from_expansion.ts | has properties |
| Box in library-tests/TypeScript/ExpansiveTypes/shared_non_expansive.ts | has properties |
| Box in library-tests/TypeScript/ExpansiveTypes/through_non_expansive.ts | has properties |
| C in library-tests/TypeScript/ExpansiveTypes/expansive_class.ts | has properties |
| Expand in library-tests/TypeScript/ExpansiveTypes/through_non_expansive.ts | has properties |
| ExpandUsingObjectLiteral in library-tests/TypeScript/ExpansiveTypes/expansive_object_literal.ts | has properties |
| Expansive in library-tests/TypeScript/ExpansiveTypes/leading_into_expansion.ts | has properties |
| Expansive in library-tests/TypeScript/ExpansiveTypes/simple.ts | has properties |
| ExpansiveA in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has properties |
| ExpansiveA in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has properties |
| ExpansiveB in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has properties |
| ExpansiveB in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has properties |
| ExpansiveByInference in library-tests/TypeScript/ExpansiveTypes/expansive_by_inference.ts | has properties |
| ExpansiveC in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has properties |
| ExpansiveC in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has properties |
| ExpansiveConstructSignature in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has properties |
| ExpansiveD in library-tests/TypeScript/ExpansiveTypes/mutual.ts | has properties |
| ExpansiveD in library-tests/TypeScript/ExpansiveTypes/mutual_multigraph.ts | has properties |
| ExpansiveFunctionType in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has properties |
| ExpansiveMethod in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has properties |
| ExpansiveParameter in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has properties |
| ExpansiveSignature in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has properties |
| ExpansiveSignatureTypeBound in library-tests/TypeScript/ExpansiveTypes/expansive_signature.ts | has properties |
| ExpansiveX in library-tests/TypeScript/ExpansiveTypes/used_from_expansion.ts | has properties |
| Intl.CollatorOptions in global scope | has properties |
| Intl.NumberFormatOptions in global scope | has properties |
| NonExpansive in library-tests/TypeScript/ExpansiveTypes/shared_non_expansive.ts | has properties |

View File

@@ -1,5 +0,0 @@
import javascript
from TypeReference type
where exists(type.getProperty(_))
select type.getTypeName(), "has properties"

View File

@@ -0,0 +1,77 @@
| After |
| AfterX |
| Before |
| BeforeX |
| Box<Expand<T[]>> |
| Box<S> |
| Box<S> |
| Box<T[]> |
| Box<number> |
| C<T> |
| C<T[]> |
| Expand<T> |
| Expand<T[]> |
| ExpandUsingObjectLiteral<T> |
| ExpandUsingObjectLiteral<T[]> |
| Expansive<T> |
| Expansive<T> |
| Expansive<T[]> |
| Expansive<T[]> |
| Expansive<number> |
| Expansive<string> |
| ExpansiveA<S> |
| ExpansiveA<S> |
| ExpansiveA<T> |
| ExpansiveA<T> |
| ExpansiveB<S> |
| ExpansiveB<S> |
| ExpansiveB<T> |
| ExpansiveB<T[]> |
| ExpansiveB<T[]> |
| ExpansiveB<number> |
| ExpansiveByInference<T> |
| ExpansiveByInference<T[]> |
| ExpansiveC<T> |
| ExpansiveC<T> |
| ExpansiveC<T> |
| ExpansiveC<T[]> |
| ExpansiveC<T[]> |
| ExpansiveC<number> |
| ExpansiveConstructSignature<T> |
| ExpansiveConstructSignature<T[]> |
| ExpansiveD<T> |
| ExpansiveD<T> |
| ExpansiveD<T> |
| ExpansiveD<T> |
| ExpansiveFunctionType<T> |
| ExpansiveFunctionType<T[]> |
| ExpansiveMethod<T> |
| ExpansiveMethod<T[]> |
| ExpansiveParameter<T> |
| ExpansiveParameter<T[]> |
| ExpansiveSignature<T> |
| ExpansiveSignature<T[]> |
| ExpansiveSignatureTypeBound<T> |
| ExpansiveSignatureTypeBound<T[]> |
| ExpansiveX<T> |
| ExpansiveX<T[]> |
| NonExpansive<Box<number>> |
| NonExpansive<T> |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |
| T[] |

View File

@@ -0,0 +1,4 @@
import javascript
from TypeReference type
select type

View File

@@ -1,8 +1,4 @@
| Intl.CollatorOptions | CollatorOptions |
| Intl.NumberFormatOptions | NumberFormatOptions |
| LegacyGlobals.LegacySubclass | LegacySubclass |
| Modern.ModernClass | ModernClass |
| ModernGlobals.ModernSubclass | ModernSubclass |
| RegExp | RegExp |
| RegExpMatchArray | RegExpMatchArray |
| __Legacy.LegacyClass | LegacyClass |

View File

@@ -1,5 +1,4 @@
| Augmentation | defined in augmentation.ts |
| CollatorOptions | has no definition |
| ExternalType1 | has no definition |
| ExternalType2 | has no definition |
| InternalType | defined in client_esmodule.ts |
@@ -7,9 +6,6 @@
| LegacySubclass | has no definition |
| ModernClass | has no definition |
| ModernSubclass | has no definition |
| NumberFormatOptions | has no definition |
| OtherClass | has no definition |
| RegExp | has no definition |
| RegExpMatchArray | has no definition |
| UtilClass | has no definition |
| UtilExtraClass | has no definition |

View File

@@ -1,24 +1,16 @@
| C<Bar> | 1 | bar.ts:10:10:10:24 | class C<Bar> {} |
| C<Foo> | 1 | foo.ts:10:10:10:24 | class C<Foo> {} |
| C<any> | 1 | bar.ts:10:10:10:24 | class C<Bar> {} |
| C<any> | 1 | foo.ts:10:10:10:24 | class C<Foo> {} |
| C<number> | 1 | bar.ts:10:10:10:24 | class C<Bar> {} |
| C<number> | 1 | foo.ts:10:10:10:24 | class C<Foo> {} |
| ExportedClass<Bar> | 1 | bar.ts:4:8:4:34 | class E ... Bar> {} |
| ExportedClass<Foo> | 1 | foo.ts:4:8:4:34 | class E ... Foo> {} |
| ExportedClass<any> | 1 | bar.ts:4:8:4:34 | class E ... Bar> {} |
| ExportedClass<any> | 1 | foo.ts:4:8:4:34 | class E ... Foo> {} |
| ExportedClass<number> | 1 | bar.ts:4:8:4:34 | class E ... Bar> {} |
| ExportedClass<number> | 1 | foo.ts:4:8:4:34 | class E ... Foo> {} |
| InnerC<Foo1> | 1 | foo.ts:13:3:13:23 | class I ... oo1> {} |
| InnerC<Foo2> | 1 | foo.ts:18:3:18:23 | class I ... oo2> {} |
| InnerC<any> | 1 | foo.ts:13:3:13:23 | class I ... oo1> {} |
| InnerC<any> | 1 | foo.ts:18:3:18:23 | class I ... oo2> {} |
| InnerC<number> | 1 | foo.ts:13:3:13:23 | class I ... oo1> {} |
| InnerC<number> | 1 | foo.ts:18:3:18:23 | class I ... oo2> {} |
| LocalClass<Bar> | 1 | bar.ts:3:1:3:24 | class L ... Bar> {} |
| LocalClass<Foo> | 1 | foo.ts:3:1:3:24 | class L ... Foo> {} |
| LocalClass<any> | 1 | bar.ts:3:1:3:24 | class L ... Bar> {} |
| LocalClass<any> | 1 | foo.ts:3:1:3:24 | class L ... Foo> {} |
| LocalClass<number> | 1 | bar.ts:3:1:3:24 | class L ... Bar> {} |
| LocalClass<number> | 1 | foo.ts:3:1:3:24 | class L ... Foo> {} |

View File

@@ -20,7 +20,6 @@
| Glob in global scope |
| H in namespaces.ts:27 |
| H.I in namespaces.ts:27 |
| Intl in global scope |
| N in library-tests/TypeScript/QualifiedNameResolution/export-specifiers.ts |
| X in global scope |
| X in library-tests/TypeScript/QualifiedNameResolution/namespaces.ts |

View File

@@ -1,10 +1,4 @@
| Array in global scope |
| Intl in global scope |
| Intl.CollatorOptions in global scope |
| Intl.NumberFormatOptions in global scope |
| MK in unknown scope |
| Mapped in library-tests/TypeScript/RegressionTests/EmptyName/test.ts |
| RegExp in global scope |
| RegExpMatchArray in global scope |
| fn in library-tests/TypeScript/RegressionTests/EmptyName/test.ts |
| library-tests/TypeScript/RegressionTests/EmptyName/test.ts |

View File

@@ -1,4 +1,2 @@
| Bar.Foo in global scope | Bar in global scope |
| Intl.CollatorOptions in global scope | Intl in global scope |
| Intl.NumberFormatOptions in global scope | Intl in global scope |
| fn in library-tests/TypeScript/RegressionTests/SemicolonInName/test.ts | library-tests/TypeScript/RegressionTests/SemicolonInName/test.ts |

View File

@@ -1,4 +1,3 @@
| D | D |
| E | E |
| S | S |
| U | U |

View File

@@ -2,18 +2,6 @@
| <E>(x: () => E): E | 1 | 0 | E | no bound |
| <E>(x: E[] \| (() => E)): E | 1 | 0 | E | no bound |
| <E>(x: E[]): E | 1 | 0 | E | no bound |
| <S extends E>(callbackfn: (value: E, index: number, array: E[]) => va... | 1 | 0 | S | no bound |
| <S extends T \| S>(callbackfn: (value: T \| S, index: number, array: (T... | 1 | 0 | S | no bound |
| <S extends T>(callbackfn: (value: T, index: number, array: T[]) => va... | 1 | 0 | S | no bound |
| <S extends any>(callbackfn: (value: any, index: number, array: any[])... | 1 | 0 | S | any |
| <S extends any[]>(x: S, y: T[]): S | 1 | 0 | S | any[] |
| <S>(x: S, y: S): S | 1 | 0 | S | no bound |
| <S>(x: S, y: T): [S, T] | 1 | 0 | S | no bound |
| <U>(callbackfn: (previousValue: U, currentValue: E, currentIndex: num... | 1 | 0 | U | no bound |
| <U>(callbackfn: (previousValue: U, currentValue: T \| S, currentIndex:... | 1 | 0 | U | no bound |
| <U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: num... | 1 | 0 | U | no bound |
| <U>(callbackfn: (previousValue: U, currentValue: any, currentIndex: n... | 1 | 0 | U | no bound |
| <U>(callbackfn: (value: E, index: number, array: E[]) => U, thisArg?:... | 1 | 0 | U | no bound |
| <U>(callbackfn: (value: T \| S, index: number, array: (T \| S)[]) => U,... | 1 | 0 | U | no bound |
| <U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?:... | 1 | 0 | U | no bound |
| <U>(callbackfn: (value: any, index: number, array: any[]) => U, thisA... | 1 | 0 | U | no bound |