Skip to content

Commit c73e6ac

Browse files
committed
feature: the filter functions can take a bunch of elements
1 parent 5439a8c commit c73e6ac

File tree

2 files changed

+77
-56
lines changed

2 files changed

+77
-56
lines changed

filter.spec.ts

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,78 @@
1-
import { isSet, notNullable, requiredIsNotNullable, requiredIsSet } from './filter';
1+
import {
2+
isSet,
3+
notNullable,
4+
requiredIsNotNullable,
5+
requiredIsSet,
6+
} from "./filter";
27

3-
type T = { readonly key?: string | null | number | boolean };
8+
type T = {
9+
readonly key?: string | null | number | boolean;
10+
readonly key2?: string | null | number | boolean;
11+
};
412

5-
describe('array.filter(requiredIsSet)', () => {
6-
it('return true if element is set', () => {
7-
const test_array: readonly T[] = [
8-
{ key: 'valid' },
9-
{ key: null },
10-
{ key: undefined },
11-
{},
12-
{ key: 0 },
13-
{ key: false },
14-
] as const;
13+
describe("array.filter(requiredIsSet)", () => {
14+
it("return true if element is set", () => {
15+
const test_array: readonly T[] = [
16+
{ key: "valid", key2: true },
17+
{ key: null, key2: true },
18+
{ key: undefined, key2: true },
19+
{ key2: true },
20+
{ key: 0, key2: true },
21+
{ key: false, key2: true },
22+
{ key: false, key2: true },
23+
] as const;
1524

16-
const result = test_array.filter(requiredIsSet('key'));
25+
const result = test_array.filter(requiredIsSet("key", "key2"));
1726

18-
expect(result).toStrictEqual([{ key: 'valid' }, { key: null }, { key: 0 }, { key: false }]);
19-
});
27+
expect(result).toStrictEqual([
28+
{ key: "valid", key2: true },
29+
{ key: null, key2: true },
30+
{ key: 0, key2: true },
31+
{ key: false, key2: true },
32+
{ key: false, key2: true },
33+
]);
34+
});
2035
});
2136

22-
describe('array.filter(requiredIsNotNullable)', () => {
23-
it('return true if element is set and not null', () => {
24-
const test_array: readonly T[] = [
25-
{ key: 'valid' },
26-
{ key: null },
27-
{ key: undefined },
28-
{},
29-
{ key: 0 },
30-
{ key: false },
31-
] as const;
32-
33-
const result = test_array.filter(requiredIsNotNullable('key'));
34-
35-
expect(result).toStrictEqual([{ key: 'valid' }, { key: 0 }, { key: false }]);
36-
});
37+
describe("array.filter(requiredIsNotNullable)", () => {
38+
it("return true if element is set and not null", () => {
39+
const test_array: readonly T[] = [
40+
{ key: "valid", key2: true },
41+
{ key: null, key2: true },
42+
{ key: undefined, key2: true },
43+
{ key2: true },
44+
{ key: 0, key2: true },
45+
{ key: false, key2: true },
46+
{ key: false, key2: true },
47+
] as const;
48+
49+
const result = test_array.filter(requiredIsNotNullable("key"));
50+
51+
expect(result).toStrictEqual([
52+
{ key: "valid", key2: true },
53+
{ key: 0, key2: true },
54+
{ key: false, key2: true },
55+
{ key: false, key2: true },
56+
]);
57+
});
3758
});
3859

39-
describe('array.filter(isSet)', () => {
40-
it('remove undefined elements', () => {
41-
const testArray = ['valid', null, undefined, 0, false] as const;
60+
describe("array.filter(isSet)", () => {
61+
it("remove undefined elements", () => {
62+
const testArray = ["valid", null, undefined, 0, false] as const;
4263

43-
const result = testArray.filter(isSet);
64+
const result = testArray.filter(isSet);
4465

45-
expect(result).toStrictEqual(['valid', null, 0, false]);
46-
});
66+
expect(result).toStrictEqual(["valid", null, 0, false]);
67+
});
4768
});
4869

49-
describe('array.filter(notNullable)', () => {
50-
it('remove null and undefined elements', () => {
51-
const testArray = ['valid', null, undefined, 0, false] as const;
70+
describe("array.filter(notNullable)", () => {
71+
it("remove null and undefined elements", () => {
72+
const testArray = ["valid", null, undefined, 0, false] as const;
5273

53-
const result = testArray.filter(notNullable);
74+
const result = testArray.filter(notNullable);
5475

55-
expect(result).toStrictEqual(['valid', 0, false]);
56-
});
76+
expect(result).toStrictEqual(["valid", 0, false]);
77+
});
5778
});

filter.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,33 @@ export type WithNonNullable<T, K extends keyof T> = Omit<T, K> &
99
Record<K, NonNullable<T[K]>>;
1010

1111
/**
12-
* filter function to check if the object key is defined
12+
* filter function to check if the object keys are defined
1313
*
1414
* ```ts
15-
* const array: Array<{key?: string}> = [{}, {key: "ok"}]
16-
* const result: Array<{key: string}> = array.filter(requiredIsSet('key')) // [{key: "ok"}]
15+
* const array: Array<{keys?: string}> = [{}, {keys: "ok"}]
16+
* const result: Array<{keys: string}> = array.filter(requiredIsSet('keys')) // [{keys: "ok"}]
1717
* ```
18-
* @param key key of the filter element to check
19-
* @returns a function to use in filter returning true if the row's key isSet
18+
* @param keys keys of the filter element to check
19+
* @returns a function to use in filter returning true if the row's keys are setSet
2020
*/
21-
export function requiredIsSet<T, K extends keyof T>(key: K) {
21+
export function requiredIsSet<T, K extends keyof T>(...keys: K[]) {
2222
return (row: T | WithRequired<T, K>): row is WithRequired<T, K> =>
23-
isSet(row[key]);
23+
keys.every((key) => isSet(row[key]));
2424
}
2525

2626
/**
27-
* filter function to check if the object key is defined and not null
27+
* filter function to check if the object keys are defined and not null
2828
*
2929
* ```ts
30-
* const array: Array<{key?: string}> = [{}, {key: null}, {key: "ok"}]
31-
* const result: Array<{key: string}> = array.filter(requiredIsNotNullable('key')) // [{key: "ok"}]
30+
* const array: Array<{keys?: string}> = [{}, {keys: null}, {keys: "ok"}]
31+
* const result: Array<{keys: string}> = array.filter(requiredIsNotNullable('keys')) // [{keys: "ok"}]
3232
* ```
33-
* @param key key of the filter element to check
34-
* @returns a function to use in filter returning true if the row's key is notNullable
33+
* @param keys keys of the filter element to check
34+
* @returns a function to use in filter returning true if the row's keys is notNullable
3535
*/
36-
export function requiredIsNotNullable<T, K extends keyof T>(key: K) {
36+
export function requiredIsNotNullable<T, K extends keyof T>(...keys: K[]) {
3737
return (row: T | WithNonNullable<T, K>): row is WithNonNullable<T, K> =>
38-
notNullable(row[key]);
38+
keys.every((key) => notNullable(row[key]));
3939
}
4040

4141
/**

0 commit comments

Comments
 (0)