【发布时间】:2020-07-13 21:11:37
【问题描述】:
我有这样的代码,方法有 2 个重载:
/**
* Returns all keys of object that have specific value:
* @example
* KeysOfType<{a:1, b:2, c:1}, 1> == 'a' | 'c'
*/
type KeysOfType<MapT extends Record<string, any>, ValT> = {
[K in keyof MapT]: MapT[K] extends ValT ? K : never;
}[keyof MapT];
export class Hooks<EventsMap extends Record<string, any>> {
fireHooks<K extends KeysOfType<EventsMap, void>>(
event: K,
context: void,
): Promise<void>;
fireHooks<K extends keyof EventsMap>(
event: K,
context: EventsMap[K],
): Promise<void>;
fireHooks<K extends keyof EventsMap>(event: K, context: EventsMap[K]) {
// ...
}
}
应该是这样使用的:
type MyHooks = {
aaa: void;
bbb: { data: string }
};
let h = new Hooks<MyHooks>();
h.fireHooks('aaa');
h.fireHooks('bbb', { data: 'data' });
有一个泛型类Hooks 带有方法fireHooks,它采用事件名称到上下文数据的映射来验证事件的上下文。
有些事件可以在没有任何上下文的情况下调用,所以我希望这个方法只用一个参数调用这些事件。
一切正常,但问题是这些重载看起来很丑陋而且矫枉过正。
如果我跳过重载,TS 会在 h.fireHooks('aaa'); 上抱怨
Expected 2 arguments, but got 1.ts(2554)
如果我只跳过第二次重载,这似乎是 100% 的实现副本,TS 会在 h.fireHooks('bbb', { data: 'data' }); 上抱怨
Argument of type '"bbb"' is not assignable to parameter of type '"aaa"'.ts(2345)
谁能解释一下
- 为什么我需要第一次重载才能跳过参数
- 以及为什么我需要第二次重载,这似乎是多余的,因为它与实现完全相同?
【问题讨论】:
-
关于第一个问题:可能是一个但是在 TS 中:github.com/microsoft/TypeScript/issues/39600
标签: typescript types overloading