Skip to content

Commit cf2a9c5

Browse files
committed
挑战1
1 parent 6378bbe commit cf2a9c5

File tree

5 files changed

+37
-19
lines changed

5 files changed

+37
-19
lines changed

src/06-challenges/29-infinite-scroll.problem.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { expect, it } from "vitest";
22
import { Equal, Expect } from "../helpers/type-utils";
33

4-
const makeInfiniteScroll = (params: unknown) => {
4+
interface MakeInfiniteScrollParams<TRow> {
5+
key: keyof TRow;
6+
fetchRows: () => Promise<TRow[]>;
7+
initialRows?: TRow[];
8+
}
9+
10+
const makeInfiniteScroll = <TRow>(params: MakeInfiniteScrollParams<TRow>) => {
511
const data = params.initialRows || [];
612

713
const scroll = async () => {

src/06-challenges/29.2-dynamic-function-arguments.problem.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ interface Events {
88
focus: undefined;
99
}
1010

11-
export const sendEvent = (event: keyof Events, ...args: any[]) => {
11+
export const sendEvent = <EventType extends keyof Events>(
12+
event: EventType,
13+
...args: Events[EventType] extends undefined ? [] : [Events[EventType]] // args的类型不是数组而是元组,元组长度代表参数个数,0就代表没有参数
14+
) => {
1215
// Send the event somewhere!
1316
};
1417

src/06-challenges/29.5-pick.problem.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { expect, it } from "vitest";
22
import { Equal, Expect } from "../helpers/type-utils";
33

4-
const pick = (obj: {}, picked: string[]) => {
4+
// TKey是泛型,它是union类型中的其中一个
5+
const pick = <TObj, TKey extends keyof TObj>(obj: TObj, picked: TKey[]) => {
56
return picked.reduce((acc, key) => {
67
acc[key] = obj[key];
78
return acc;
8-
}, {});
9+
}, {} as Record<TKey, TObj[TKey]>);
910
};
1011

1112
it("Should pick the keys from the object", () => {

src/06-challenges/30-form-validator.problem.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
import { expect, it } from "vitest";
22
import { Equal, Expect } from "../helpers/type-utils";
33

4-
const makeFormValidatorFactory = (validators: unknown) => (config: unknown) => {
5-
return (values: unknown) => {
6-
const errors = {} as any;
4+
const makeFormValidatorFactory =
5+
<TValidatorKey extends string>(
6+
validators: Record<TValidatorKey, (value: string) => string | void>
7+
) =>
8+
<TConfigKey extends string>(config: Record<TConfigKey, TValidatorKey[]>) => {
9+
return (values: Record<TConfigKey, string>) => {
10+
const errors = {} as Record<TConfigKey, string | undefined>;
711

8-
for (const key in config) {
9-
for (const validator of config[key]) {
10-
const error = validators[validator](values[key]);
11-
if (error) {
12-
errors[key] = error;
13-
break;
12+
for (const key in config) {
13+
for (const validator of config[key]) {
14+
const error = validators[validator](values[key]);
15+
if (error) {
16+
errors[key] = error;
17+
break;
18+
}
1419
}
1520
}
16-
}
1721

18-
return errors;
22+
return errors;
23+
};
1924
};
20-
};
2125

2226
const createFormValidator = makeFormValidatorFactory({
2327
required: (value) => {
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import { expect, it } from "vitest";
22
import { Equal, Expect } from "../helpers/type-utils";
33

4-
const fetchData = async <TResult>(url: string): Promise<TResult> => {
4+
const fetchData = async <
5+
TResult extends any = "You must pass a type argument to fetchData"
6+
>(
7+
url: string
8+
): Promise<TResult> => {
59
const data = await fetch(url).then((response) => response.json());
610
return data;
711
};
812

913
it("Should fetch data from an API", async () => {
1014
const data = await fetchData<{ name: string }>(
11-
"https://swapi.dev/api/people/1",
15+
"https://swapi.dev/api/people/1"
1216
);
1317
expect(data.name).toEqual("Luke Skywalker");
1418

@@ -19,6 +23,6 @@ it("Should force you to add a type annotation with a helpful error message", asy
1923
const data = await fetchData("https://swapi.dev/api/people/1");
2024

2125
type tests = [
22-
Expect<Equal<typeof data, "You must pass a type argument to fetchData">>,
26+
Expect<Equal<typeof data, "You must pass a type argument to fetchData">>
2327
];
2428
});

0 commit comments

Comments
 (0)