Skip to content

Commit 1cffa2f

Browse files
committed
feat: types新增加导出listeners和anyListener
1 parent fcf0d32 commit 1cffa2f

6 files changed

Lines changed: 196 additions & 13 deletions

File tree

docs/zh/guide/use/metadata.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ emitter.on('x', (message, args) => {
2626

2727
也可以在触发事件时提供额外元数据,该元数据将被合并到事件消息的元数据中。
2828

29-
```typescript
29+
```typescript twoslash
3030
import { FastEvent } from 'fastevent';
3131

3232
const emitter = new FastEvent({

docs/zh/guide/use/typescript.md

Lines changed: 173 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ emitter.on('click', function (message) {
251251

252252
- `TypedFastEventListener`
253253

254+
根据`FastEvent`泛型参数自动推导出来的监听器类型。
254255

255256
```ts twoslash
256257
import { FastEvent,FastEventMessage } from 'fastevent';
@@ -264,17 +265,74 @@ type CustomEvents = {
264265
const emitter = new FastEvent<CustomEvents>();
265266

266267
type ClickListener = typeof emitter.types.listeners['click']
268+
const listener:ClickListener = (message) => {
269+
message.type
270+
message.payload
271+
}
267272

268273
```
269274

270275
- `TypedFastEventAnyListener`
276+
277+
根据`FastEvent`泛型参数自动推导出来的监听器类型。
278+
279+
```ts twoslash
280+
import { FastEvent,FastEventMessage } from 'fastevent';
281+
282+
type CustomEvents = {
283+
click: { x: number; y: number };
284+
mousemove: boolean;
285+
scroll: number;
286+
focus: string;
287+
};
288+
const emitter = new FastEvent<CustomEvents>();
289+
290+
type anyListener = typeof emitter.types.anyListener
291+
292+
const listener:anyListener = (message) => {
293+
if(message.type=='click'){
294+
message.payload
295+
}else if(message.type=='mousemove'){
296+
message.payload
297+
}else if(message.type=='scroll'){
298+
message.payload
299+
}
300+
}
301+
302+
303+
```
304+
305+
271306
- `FastEventListener`
272307

308+
通用的监听器类型。
273309

274-
## 检索类型
310+
```ts twoslash
311+
import { FastEvent,FastEventMessage,FastEventListener } from 'fastevent';
275312

276-
`FastEvent``FastEventScope`都提供了`types`对象用于检索事件类型。
313+
type CustomEvents = {
314+
click: { x: number; y: number };
315+
mousemove: boolean;
316+
scroll: number;
317+
focus: string;
318+
};
319+
const emitter = new FastEvent<CustomEvents>();
320+
321+
type anyListener = typeof emitter.types.anyListener
322+
323+
const listener:FastEventListener<number> = (message) => {
324+
message.type
325+
message.payload
326+
}
327+
328+
329+
```
330+
331+
332+
## 检索类型
277333

334+
`FastEvent``FastEventScope`支持泛型参数推导,为提供了`types`对象用于检索以下类型。
335+
278336
```ts twoslash
279337
import { FastEvent } from 'fastevent';
280338

@@ -302,6 +360,9 @@ type EventType = typeof emitter.types.events;
302360
type MetaType = typeof emitter.types.meta;
303361
type ContextType = typeof emitter.types.context;
304362
type MessageType = typeof emitter.types.message;
363+
type ListenersType = typeof emitter.types.listeners;
364+
type anylistenerType = typeof emitter.types.anyListener;
365+
305366

306367
```
307368

@@ -312,3 +373,113 @@ type MessageType = typeof emitter.types.message;
312373
:::
313374

314375

376+
## 全局扩展
377+
378+
`FastEvent``FastEventScope`支持全局扩展,用于扩展`FastEvent``FastEventScope`的类型。
379+
380+
### FastEvents
381+
382+
扩展全局事件类型。
383+
384+
```ts twoslash
385+
import { FastEvent } from 'fastevent';
386+
387+
declare module "fastevent" {
388+
interface FastEvents {
389+
click: { x: number; y: number };
390+
mousemove: boolean;
391+
scroll: number;
392+
focus: string;
393+
}
394+
}
395+
const emitter = new FastEvent();
396+
397+
type EventTypes = typeof emitter.types.events
398+
399+
```
400+
401+
402+
### FastEventMeta
403+
404+
扩展全局元数据类型。
405+
406+
```ts twoslash
407+
import { FastEvent } from 'fastevent';
408+
409+
declare module "fastevent" {
410+
interface FastEventMeta {
411+
x: number;
412+
y: number;
413+
z?: number;
414+
}
415+
}
416+
417+
const emitter = new FastEvent();
418+
419+
type MetaType = typeof emitter.types.meta
420+
421+
emitter.onAny((message) => {
422+
message.meta.x // number
423+
message.meta.y // boolean
424+
message.meta.z // string
425+
})
426+
```
427+
428+
429+
### FastEventScopeMeta
430+
431+
扩展全局事件作用域元数据类型。
432+
433+
```ts twoslash
434+
import { FastEvent } from 'fastevent';
435+
436+
declare module "fastevent" {
437+
interface FastEventMeta {
438+
root: number;
439+
}
440+
interface FastEventScopeMeta {
441+
x: number;
442+
y: boolean;
443+
z?: string;
444+
}
445+
}
446+
447+
const emitter = new FastEvent();
448+
449+
const scope = emitter.scope("a/b/c");
450+
451+
type MetaType = typeof scope.types.meta
452+
453+
scope.onAny((message) => {
454+
message.meta.x // number
455+
message.meta.y // boolean
456+
message.meta.z // string
457+
message.meta.scope // string
458+
message.meta.root // number
459+
})
460+
461+
```
462+
463+
### FastEventMessageExtends
464+
465+
扩展全局消息类型。
466+
467+
```ts twoslash
468+
import { FastEvent,FastEventMessage } from 'fastevent';
469+
470+
declare module "fastevent" {
471+
interface FastEventMessageExtends {
472+
timestamp: number;
473+
}
474+
}
475+
476+
const message:FastEventMessage = {
477+
type: "click",
478+
payload: {
479+
x: 1,
480+
y: 2
481+
},
482+
timestamp: 1629999999999
483+
}
484+
485+
```

packages/native/src/__tests__/types/event.types.test.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@ import type { Equal, Expect, NotAny } from '@type-challenges/utils'
44
import { FastEvent } from "../../event"
55
import { TypedFastEventMessage, FastEventMeta, PickScopeEvents, ScopeEvents } from "../../types"
66
import { FastEventScopeMeta } from "../../scope"
7-
import { FastEventBus } from "../../eventbus"
8-
import { E } from "vitest/dist/chunks/environment.d.Dmw5ulng.js"
7+
// declare module "../.." {
8+
// interface FastEvents {
9+
// click: { x: number; y: number };
10+
// mousemove: boolean;
11+
// scroll: number;
12+
// focus: string;
13+
// }
14+
// }
915

1016
describe("类型系统测试", () => {
1117
describe("作用域事件类型定义", () => {
@@ -28,6 +34,8 @@ describe("类型系统测试", () => {
2834
c: 3
2935
}>>
3036
]
37+
38+
3139
})
3240
})
3341

@@ -50,6 +58,7 @@ describe("类型系统测试", () => {
5058
type CustomMessage = TypedFastEventMessage<CustomEvents, CustomMeta>
5159
const emitter = new FastEvent<CustomEvents, CustomMeta>()
5260

61+
5362
test("on方法应正确推导事件类型和元数据", () => {
5463
emitter.on("a", (message) => {
5564
type cases = [

packages/native/src/event.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export class FastEvent<
4444
Events extends Record<string, any> = Record<string, any>,
4545
Meta extends Record<string, any> = Record<string, any>,
4646
Context = never,
47-
// 以上几个泛型是快捷方式
47+
// 泛型快捷方式
4848
AllEvents extends Record<string, any> = Events & FastEvents,
4949
Types extends keyof AllEvents = Expand<Exclude<keyof (AllEvents), number | symbol>>
5050
> {
@@ -71,7 +71,8 @@ export class FastEvent<
7171
meta: undefined as unknown as Expand<FastEventMeta & Meta & Record<string, any>>,
7272
context: undefined as unknown as Expand<Fallback<Context, typeof this>>,
7373
message: undefined as unknown as TypedFastEventMessageOptional<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>,
74-
listeners: undefined as unknown as FastEventListeners<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>
74+
listeners: undefined as unknown as FastEventListeners<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>,
75+
anyListener: undefined as unknown as TypedFastEventAnyListener<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>, Expand<Fallback<Context, typeof this>>>
7576
}
7677

7778
/**

packages/native/src/scope.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type FastEventScopeOptions<Meta = Record<string, any>, Context = never> =
1414
onMessage?: TypedFastEventListener
1515
}
1616

17-
export type FastEventScopeMeta = {
17+
export interface FastEventScopeMeta {
1818
scope: string
1919
}
2020

@@ -32,7 +32,9 @@ export class FastEventScope<
3232
meta: undefined as unknown as FinalMeta,
3333
context: undefined as unknown as Fallback<Context, typeof this>,
3434
message: undefined as unknown as TypedFastEventMessageOptional<Events, FinalMeta>,
35-
listeners: undefined as unknown as FastEventListeners<Events, FinalMeta>
35+
listeners: undefined as unknown as FastEventListeners<Events, FinalMeta>,
36+
anyListener: undefined as unknown as TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>
37+
3638
}
3739
prefix: string = ''
3840
emitter!: FastEvent<Events>

packages/native/src/types.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type FastEventMessage<P = any, M extends Record<string, any> = Record<str
1515
type: T
1616
payload: P
1717
meta?: M & Partial<FastEventMeta>
18-
}
18+
} & FastEventMessageExtends
1919

2020

2121
export type TypedFastEventMessage<
@@ -29,7 +29,7 @@ export type TypedFastEventMessage<
2929
meta: FastEventMeta & M & Record<string, any>
3030
}
3131
}[Exclude<keyof Events, number | symbol>]
32-
) & DeepPartial<FastEventMessageExtends>
32+
) & FastEventMessageExtends
3333

3434

3535
// 用于构建消息时使用,meta是可选的
@@ -44,7 +44,7 @@ export type TypedFastEventMessageOptional<
4444
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>
4545
}
4646
}[Exclude<keyof Events, number | symbol>]
47-
) & DeepPartial<FastEventMessageExtends>
47+
) & FastEventMessageExtends
4848

4949

5050

@@ -60,7 +60,7 @@ export type FastEventEmitMessage<
6060
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>
6161
}
6262
}[Exclude<keyof Events, number | symbol>]
63-
) & DeepPartial<FastEventMessageExtends>
63+
) & FastEventMessageExtends
6464

6565

6666

0 commit comments

Comments
 (0)