Skip to content

Commit 66cfde7

Browse files
committed
wip: update
1 parent 835c2f9 commit 66cfde7

File tree

5 files changed

+55
-31
lines changed

5 files changed

+55
-31
lines changed

misc.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ declare namespace Layui {
66
type MaybeArray<T> = T | T[];
77
type MaybePromise<T> = T | Promise<T> | JQuery.Deferred<T>;
88
type LiteralUnion<T extends U, U = string> = T | (U & {});
9+
type OmitIndexSignature<ObjectType> = {
10+
[KeyType in keyof ObjectType as {} extends Record<KeyType, unknown>
11+
? never
12+
: KeyType]: ObjectType[KeyType];
13+
};
914

1015
type ExportsCallback = (this: Layui, fn: (app: string, exports: object) => void) => void;
1116

modules/lay.d.ts

+28-8
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,22 @@ declare namespace Layui {
7575
* @param fn 回调
7676
* @since 2.9.11 新增 options
7777
*/
78-
off<K extends keyof HTMLElementEventMap>(eventName: K, fn: (this: TElement, e: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): this;
78+
off<K extends keyof HTMLElementEventMap>(
79+
eventName: K,
80+
fn: (this: TElement, e: HTMLElementEventMap[K]) => any,
81+
options?: boolean | EventListenerOptions
82+
): this;
7983
/**
8084
* 事件绑定,注意:只支持内置事件,不支持自定义事件
8185
* @param eventName 事件名 比如click,自定事件会绑定失败
8286
* @param fn 回调
8387
* @since 2.9.11 新增 options
8488
*/
85-
on<K extends keyof HTMLElementEventMap>(eventName: K, fn: (this: TElement, e: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): this;
89+
on<K extends keyof HTMLElementEventMap>(
90+
eventName: K,
91+
fn: (this: TElement, e: HTMLElementEventMap[K]) => any,
92+
options?: boolean | AddEventListenerOptions
93+
): this;
8694
/**
8795
* 移除元素
8896
* @param elem 实际是 removeChild(elem)
@@ -184,17 +192,26 @@ declare namespace Layui {
184192
offset?: [offsetX: number, offsetY: number]
185193
}
186194

187-
interface LayOnClickOutsideOpsions {
195+
type LayOnClickOutsideScope = HTMLElement | Document | Window;
196+
type LayOnClickOutsideScopeEventMap<SElement> = SElement extends Window
197+
? WindowEventMap
198+
: SElement extends Document
199+
? DocumentEventMap
200+
: SElement extends HTMLElement
201+
? HTMLElementEventMap
202+
: never;
203+
type LayOnClickOutsideEventMap<SElement> = Pick<LayOnClickOutsideScopeEventMap<SElement>, 'click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend' | 'pointerdown' | 'pointerup'>;
204+
interface LayOnClickOutsideOpsions<E extends keyof LayOnClickOutsideEventMap<S>, S extends LayOnClickOutsideScope> {
188205
/**
189206
* 监听的事件类型
190207
* @default 'pointerdown''
191208
*/
192-
event?: string;
209+
event?: E;
193210
/**
194211
* 监听范围
195212
* @default document
196213
*/
197-
scope?: HTMLElement | Document | Window;
214+
scope?: S;
198215
/**
199216
* 忽略监听的元素或选择器字符串
200217
*/
@@ -429,10 +446,13 @@ declare namespace Layui {
429446
* @param options
430447
* @return 返回一个停止事件监听的函数
431448
*/
432-
onClickOutside(
449+
onClickOutside<
450+
E extends keyof LayOnClickOutsideEventMap<S> = 'pointerdown',
451+
S extends LayOnClickOutsideScope = Document
452+
>(
433453
target: HTMLElement,
434-
handler: (e: MouseEvent) => void,
435-
options?: LayOnClickOutsideOpsions
454+
handler: (e: LayOnClickOutsideEventMap<S>[E]) => void,
455+
options?: LayOnClickOutsideOpsions<E, S>
436456
): Fn;
437457
/**
438458
* 判断一个对象是否具有某个自身的属性,而不考虑继承的属性

modules/util.d.ts

+14-19
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,7 @@ declare namespace Layui {
181181

182182
type TypeToTriggeredEventMap<TElement> = JQuery.TypeToTriggeredEventMap<TElement, undefined, any, any>
183183

184-
type TriggerEvent = 'change' | 'resize' | 'scroll' | 'select' | 'submit'
185-
| 'click' | 'contextmenu' | 'dblclick' | 'mousedown' | 'mouseenter' | 'mouseleave' | 'mousemove' | 'mouseout' | 'mouseover' | 'mouseup'
186-
| 'drag' | 'dragEnd' | 'dragenter' | 'dragexit' | 'dragleave' | 'dragover' | 'dragstart' | 'drop'
187-
| 'keydown' | 'keypress' | 'keyup'
188-
| 'touchcancel' | 'touchend' | 'touchmove' | 'touchstart'
189-
| 'blur' | 'focus' | 'focusin' | 'focusout'
184+
type TriggerEvent<TElement> = keyof Layui.OmitIndexSignature<TypeToTriggeredEventMap<TElement>>;
190185

191186
/**
192187
* 工具集
@@ -296,7 +291,7 @@ declare namespace Layui {
296291
* @deprecated 2.8.0 已弃用,请使用 {@link Util.on|util.on}
297292
* @see {@link Util.event|util.on}
298293
*/
299-
event(attr: string, obj: { [index: string]: (othis: JQuery) => any }, eventType?: TriggerEvent): void;
294+
event(attr: string, obj: { [index: string]: (othis: JQuery) => any }, eventType?: TriggerEvent<HTMLBodyElement>): void;
300295
/**
301296
* 批量事件处理
302297
* @param attr 触发事件的元素属性名,默认值 'lay-on'
@@ -306,10 +301,10 @@ declare namespace Layui {
306301
* @since 2.8.0
307302
* @since 2.9.0 事件处理函数新增第二个参数 e 事件对象;新增事件集合返回值;
308303
*/
309-
on<TEventType extends TriggerEvent = 'click', TElement = HTMLElement>(
304+
on<TEventType extends TriggerEvent<TElement> = 'click', TElement = HTMLBodyElement>(
310305
attr: string,
311306
events: {
312-
[attrValue: string]: (othis: JQuery<TElement>, e?: TypeToTriggeredEventMap<TElement>[TEventType]) => any
307+
[attrValue: string]: (othis: JQuery, e?: TypeToTriggeredEventMap<TElement>[TEventType]) => any
313308
},
314309
trigger?: TEventType,
315310
): typeof events;
@@ -323,14 +318,14 @@ declare namespace Layui {
323318
* @returns 返回当前 events 参数设置的事件集合
324319
* @since 2.9.0
325320
*/
326-
on<TEventType extends TriggerEvent = 'click', TElement = HTMLElement>(
321+
on<TEventType extends TriggerEvent<TElement> = 'click', TElement = HTMLBodyElement>(
327322
attr: string,
328323
events: {
329-
[attrValue: string]: (othis: JQuery<TElement>, e: TypeToTriggeredEventMap<TElement>[TEventType]) => any
324+
[attrValue: string]: (othis: JQuery, e: TypeToTriggeredEventMap<TElement>[TEventType]) => any
330325
},
331326
options?: {
332-
trigger?: TEventType | TriggerEvent;
333-
elem?: string | HTMLElement | JQuery
327+
trigger?: TEventType | TriggerEvent<TElement>;
328+
elem?: string | TElement | JQuery<TElement>
334329
},
335330
): typeof events
336331
/**
@@ -340,9 +335,9 @@ declare namespace Layui {
340335
* @returns 返回当前 events 参数设置的事件集合
341336
* @since 2.9.0
342337
*/
343-
on<TEventType extends TriggerEvent = 'click', TElement = HTMLElement>(
338+
on<TEventType extends TriggerEvent<TElement> = 'click', TElement = HTMLBodyElement>(
344339
events: {
345-
[attrValue: string]: (othis: JQuery<TElement>, e: TypeToTriggeredEventMap<TElement>[TEventType]) => any
340+
[attrValue: string]: (othis: JQuery, e: TypeToTriggeredEventMap<TElement>[TEventType]) => any
346341
},
347342
trigger?: TEventType,
348343
): typeof events
@@ -355,13 +350,13 @@ declare namespace Layui {
355350
* @returns 返回当前 events 参数设置的事件集合
356351
* @since 2.9.0
357352
*/
358-
on<TEventType extends TriggerEvent = 'click', TElement = HTMLElement>(
353+
on<TEventType extends TriggerEvent<TElement> = 'click', TElement = HTMLBodyElement>(
359354
events: {
360-
[attrValue: string]: (othis: JQuery<TElement>, e: TypeToTriggeredEventMap<TElement>[TEventType]) => any
355+
[attrValue: string]: (othis: JQuery, e: TypeToTriggeredEventMap<TElement>[TEventType]) => any
361356
},
362357
options?: {
363-
trigger?: TEventType | TriggerEvent;
364-
elem?: string | HTMLElement | JQuery
358+
trigger?: TEventType | TriggerEvent<TElement>;
359+
elem?: string | TElement | JQuery<TElement>
365360
},
366361
): typeof events;
367362
}

test/lay.test.ts

+4
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,9 @@ function layTest() {
4949
}
5050
var hasown = lay.hasOwn(window, 'name')
5151
var stop = lay.onClickOutside(document.body, (e) => {})
52+
lay.onClickOutside(document.body ,(e) => {}, {
53+
event: "pointerdown",
54+
scope: window
55+
})
5256
lay.clipboard.writeText('123')
5357
}

test/util.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ function utilTest() {
153153
alert('触发了事件3');
154154
},
155155
});
156-
util.event('lay-on', {t: () => {}}, 'click');
156+
util.event('lay-on', {t: () => {}}, 'blur');
157157
util.event('lay-on', {t: () => {}});
158-
util.on('lay-on', {t: () => {}}, 'change');
158+
util.on('lay-on', {t: () => {}}, 'click');
159159
util.on('lay-on', {t: () => {}});
160160
var onRet = util.on('lay-on', {
161161
e1: (el, e) => {
@@ -164,7 +164,7 @@ function utilTest() {
164164
e2: function(el, e) {
165165

166166
}
167-
},{trigger:'change'});
167+
},{trigger:'dblclick'});
168168

169169
util.on({t: () => {}}, 'dblclick');
170170
util.on({t: () => {}});
@@ -175,7 +175,7 @@ function utilTest() {
175175
e2: function(el, e) {
176176

177177
}
178-
},{trigger:'contextmenu'});
178+
},{trigger:'dblclick', elem: document});
179179

180180
util.openWin({
181181
target: ''

0 commit comments

Comments
 (0)