Appearance
从字段到函数的推导
题目
ts
namespace Question {
type Watcher = {
on(
eventName: string,
callback: (oldValue: any, newValue: any) => void
): void;
};
declare function watch(obj: Object): Watcher;
const personWather = watch({
firstName: "Saoirse",
lastName: "Ronan",
age: 26
});
personWather.on("ageChanged", (oldValue, newValue) => {});
}
namespace Question {
type Watcher = {
on(
eventName: string,
callback: (oldValue: any, newValue: any) => void
): void;
};
declare function watch(obj: Object): Watcher;
const personWather = watch({
firstName: "Saoirse",
lastName: "Ronan",
age: 26
});
personWather.on("ageChanged", (oldValue, newValue) => {});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
解法
ts
namespace Answer {
type Watcher<T> = {
on<K extends string & keyof T>(
eventName: `${K}Changed`,
callback: (oldValue: T[K], newValue: T[K]) => void
): void;
};
declare function watch<T>(obj: T): Watcher<T>;
const personWather = watch({
firstName: "Saoirse",
lastName: "Ronan",
age: 26
});
personWather.on("ageChanged", (oldValue, newValue) => {});
}
namespace Answer {
type Watcher<T> = {
on<K extends string & keyof T>(
eventName: `${K}Changed`,
callback: (oldValue: T[K], newValue: T[K]) => void
): void;
};
declare function watch<T>(obj: T): Watcher<T>;
const personWather = watch({
firstName: "Saoirse",
lastName: "Ronan",
age: 26
});
personWather.on("ageChanged", (oldValue, newValue) => {});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18