mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-19 21:13:30 +01:00
types(collection): reduce* method signatures (#10405)
* types(collection): reduce* method signatures * test: explicit expect() types * test: add tests for arbitrary accumulator type --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
@@ -713,14 +713,57 @@ describe('reduce() tests', () => {
|
|||||||
expect<number>(sum).toStrictEqual(6);
|
expect<number>(sum).toStrictEqual(6);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('reduce collection into a single value with different accumulator type', () => {
|
||||||
|
const str = coll.reduce((a, x) => a.concat(x.toString()), '');
|
||||||
|
expect<string>(str).toStrictEqual('123');
|
||||||
|
});
|
||||||
|
|
||||||
test('reduce empty collection with initial value', () => {
|
test('reduce empty collection with initial value', () => {
|
||||||
const coll = createCollection();
|
const coll = createCollection();
|
||||||
expect(coll.reduce((a, x) => a + x, 0)).toStrictEqual(0);
|
expect<number>(coll.reduce((a, x) => a + x, 0)).toStrictEqual(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('reduce empty collection without initial value', () => {
|
test('reduce empty collection without initial value', () => {
|
||||||
const coll = createCollection();
|
const coll = createCollection();
|
||||||
expect(() => coll.reduce((a: number, x) => a + x)).toThrowError(
|
expect(() => coll.reduce((a, x) => a + x)).toThrowError(
|
||||||
|
new TypeError('Reduce of empty collection with no initial value'),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('reduceRight() tests', () => {
|
||||||
|
const coll = createTestCollection();
|
||||||
|
|
||||||
|
test('throws if fn is not a function', () => {
|
||||||
|
// @ts-expect-error: Invalid function
|
||||||
|
expectInvalidFunctionError(() => coll.reduceRight());
|
||||||
|
// @ts-expect-error: Invalid function
|
||||||
|
expectInvalidFunctionError(() => coll.reduceRight(123), 123);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('reduce collection into a single value with initial value', () => {
|
||||||
|
const sum = coll.reduceRight((a, x) => a + x, 0);
|
||||||
|
expect<number>(sum).toStrictEqual(6);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('reduce collection into a single value without initial value', () => {
|
||||||
|
const sum = coll.reduceRight((a, x) => a + x);
|
||||||
|
expect<number>(sum).toStrictEqual(6);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('reduce collection into a single value with different accumulator type', () => {
|
||||||
|
const str = coll.reduceRight((a, x) => a.concat(x.toString()), '');
|
||||||
|
expect<string>(str).toStrictEqual('321');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('reduce empty collection with initial value', () => {
|
||||||
|
const coll = createCollection();
|
||||||
|
expect<number>(coll.reduceRight((a, x) => a + x, 0)).toStrictEqual(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('reduce empty collection without initial value', () => {
|
||||||
|
const coll = createCollection();
|
||||||
|
expect(() => coll.reduceRight((a, x) => a + x)).toThrowError(
|
||||||
new TypeError('Reduce of empty collection with no initial value'),
|
new TypeError('Reduce of empty collection with no initial value'),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -1013,31 +1056,3 @@ describe('findLastKey() tests', () => {
|
|||||||
}, null);
|
}, null);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('reduceRight() tests', () => {
|
|
||||||
const coll = createTestCollection();
|
|
||||||
|
|
||||||
test('throws if fn is not a function', () => {
|
|
||||||
// @ts-expect-error: Invalid function
|
|
||||||
expectInvalidFunctionError(() => coll.reduceRight());
|
|
||||||
// @ts-expect-error: Invalid function
|
|
||||||
expectInvalidFunctionError(() => coll.reduceRight(123), 123);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('reduce collection into a single value with initial value', () => {
|
|
||||||
const sum = coll.reduceRight((a, x) => a + x, 0);
|
|
||||||
expect(sum).toStrictEqual(6);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('reduce collection into a single value without initial value', () => {
|
|
||||||
const sum = coll.reduceRight<number>((a, x) => a + x);
|
|
||||||
expect(sum).toStrictEqual(6);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('reduce empty collection without initial value', () => {
|
|
||||||
const coll = createCollection();
|
|
||||||
expect(() => coll.reduceRight((a: number, x) => a + x)).toThrowError(
|
|
||||||
new TypeError('Reduce of empty collection with no initial value'),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -616,7 +616,15 @@ export class Collection<Key, Value> extends Map<Key, Value> {
|
|||||||
* collection.reduce((acc, guild) => acc + guild.memberCount, 0);
|
* collection.reduce((acc, guild) => acc + guild.memberCount, 0);
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
public reduce<InitialValue = Value>(
|
public reduce(
|
||||||
|
fn: (accumulator: Value, value: Value, key: Key, collection: this) => Value,
|
||||||
|
initialValue?: Value,
|
||||||
|
): Value;
|
||||||
|
public reduce<InitialValue>(
|
||||||
|
fn: (accumulator: InitialValue, value: Value, key: Key, collection: this) => InitialValue,
|
||||||
|
initialValue: InitialValue,
|
||||||
|
): InitialValue;
|
||||||
|
public reduce<InitialValue>(
|
||||||
fn: (accumulator: InitialValue, value: Value, key: Key, collection: this) => InitialValue,
|
fn: (accumulator: InitialValue, value: Value, key: Key, collection: this) => InitialValue,
|
||||||
initialValue?: InitialValue,
|
initialValue?: InitialValue,
|
||||||
): InitialValue {
|
): InitialValue {
|
||||||
@@ -645,6 +653,14 @@ export class Collection<Key, Value> extends Map<Key, Value> {
|
|||||||
* @param fn - Function used to reduce, taking four arguments; `accumulator`, `value`, `key`, and `collection`
|
* @param fn - Function used to reduce, taking four arguments; `accumulator`, `value`, `key`, and `collection`
|
||||||
* @param initialValue - Starting value for the accumulator
|
* @param initialValue - Starting value for the accumulator
|
||||||
*/
|
*/
|
||||||
|
public reduceRight(
|
||||||
|
fn: (accumulator: Value, value: Value, key: Key, collection: this) => Value,
|
||||||
|
initialValue?: Value,
|
||||||
|
): Value;
|
||||||
|
public reduceRight<InitialValue>(
|
||||||
|
fn: (accumulator: InitialValue, value: Value, key: Key, collection: this) => InitialValue,
|
||||||
|
initialValue: InitialValue,
|
||||||
|
): InitialValue;
|
||||||
public reduceRight<InitialValue>(
|
public reduceRight<InitialValue>(
|
||||||
fn: (accumulator: InitialValue, value: Value, key: Key, collection: this) => InitialValue,
|
fn: (accumulator: InitialValue, value: Value, key: Key, collection: this) => InitialValue,
|
||||||
initialValue?: InitialValue,
|
initialValue?: InitialValue,
|
||||||
|
|||||||
Reference in New Issue
Block a user