@lark.js/mvc 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lark.d.ts ADDED
@@ -0,0 +1,1176 @@
1
+ /**
2
+ * @lark/mvc 命名空间
3
+ *
4
+ * Lark 是一个轻量级的 MVC 前端框架,提供视图管理、路由、状态管理、
5
+ * 接口服务等核心能力,适用于单页应用(SPA)开发。
6
+ *
7
+ * 核心模块:
8
+ * - View:视图基类,支持 extend/merge 继承与事件方法模式
9
+ * - Router:基于 Hash 的两阶段路由确认机制
10
+ * - State:跨视图的全局可观察状态管理
11
+ * - Service:API 请求管理,支持缓存、去重与队列
12
+ * - Frame:视图帧树,管理视图的挂载/卸载生命周期
13
+ * - Updater:视图数据绑定与 VDOM Diff 渲染引擎
14
+ */
15
+ declare namespace LarkMvc {
16
+ /**
17
+ * 框架配置接口,用于 Lark.boot() 时传入应用的全局配置。
18
+ * 所有配置项均可在运行时通过 Lark.config('key') 动态访问
19
+ */
20
+ export interface Config {
21
+ /**
22
+ * 根视图所在的 DOM 节点 ID,框架将在此节点内渲染根视图。
23
+ * 该字段为必填项,若未指定则默认为 "lark-root"
24
+ */
25
+ rootId: string;
26
+ /**
27
+ * 默认加载的视图路径。当 URL 中无法匹配到任何路由时,将加载该视图作为根视图
28
+ */
29
+ defaultView?: string;
30
+ /**
31
+ * 默认路径。当 URL 哈希为空时使用的路径,默认为 "/"
32
+ */
33
+ defaultPath?: string;
34
+ /**
35
+ * 路径与视图的映射关系。
36
+ * - 简单映射:`{ "/home": "app/views/home" }`
37
+ * - 带配置映射:`{ "/detail": { view: "app/views/detail", title: "详情" } }`
38
+ * 路径重写逻辑请使用 rewrite 配置项
39
+ */
40
+ routes?: Record<string, string | { view: string; [key: string]: unknown }>;
41
+ /**
42
+ * 在 routes 中找不到匹配时使用的视图路径,例如用于显示 404 页面
43
+ */
44
+ unmatchedView?: string;
45
+ /**
46
+ * 项目启动时加载的扩展模块路径数组。
47
+ * 这些扩展会在应用初始化之前加载完成
48
+ */
49
+ exts?: string[];
50
+ /**
51
+ * 全局错误处理函数。框架以 try-catch 方式执行部分核心流程,
52
+ * 当出错时允许开发者通过该配置项进行捕获。
53
+ * 注意:不应在该方法内再次抛出任何错误
54
+ */
55
+ error?: (error: Error) => void;
56
+ /**
57
+ * 其它动态配置项,允许通过 config.key 方式访问自定义配置
58
+ */
59
+ [key: string]: unknown;
60
+ }
61
+ /**
62
+ * URL 解析结果中的路径与参数部分。
63
+ * 由 Router.parse() 返回,包含路径字符串和解析后的键值参数对
64
+ */
65
+ export interface RouterParseParts {
66
+ /**
67
+ * 解析出的参数键值对
68
+ */
69
+ readonly params: Readonly<Record<string, string>>;
70
+ /**
71
+ * 路径字符串,不包含查询参数
72
+ */
73
+ readonly path: string;
74
+ }
75
+ /**
76
+ * URL 解析结果接口,包含对当前 URL 的完整解析信息。
77
+ * 由 Router.parse() 返回,涵盖 query(?后)和 hash(#后)两部分
78
+ */
79
+ export interface RouterParse {
80
+ /**
81
+ * 原始的完整 href 字符串
82
+ */
83
+ readonly href: string;
84
+ /**
85
+ * 原始查询字符串(问号之后、井号之前的部分)
86
+ */
87
+ readonly srcQuery: string;
88
+ /**
89
+ * 原始哈希字符串(井号之后的部分)
90
+ */
91
+ readonly srcHash: string;
92
+ /**
93
+ * srcQuery 解析出的路径与参数对象
94
+ */
95
+ readonly query: RouterParseParts;
96
+ /**
97
+ * srcHash 解析出的路径与参数对象
98
+ */
99
+ readonly hash: RouterParseParts;
100
+ /**
101
+ * query.params 与 hash.params 合并后的参数对象,
102
+ * 当键名冲突时,hash 中的值优先
103
+ */
104
+ readonly params: Readonly<Record<string, string>>;
105
+ /**
106
+ * 根据 hash 中的 path 和 query 中的 path,结合路由规则计算得出的当前路径。
107
+ * 在框架启动前可能为 undefined
108
+ */
109
+ readonly path?: string;
110
+ /**
111
+ * 当前 URL 对应的要渲染的根视图路径。
112
+ * 在框架启动前可能为 undefined
113
+ */
114
+ readonly view?: string;
115
+ /**
116
+ * 从 params 中获取指定键的参数值。
117
+ * 当键不存在时返回默认值或空字符串
118
+ * @param key 参数键名
119
+ * @param defaultValue 当值不存在时返回的默认值,默认为空字符串
120
+ */
121
+ get(key: string, defaultValue?: string): string;
122
+ }
123
+ /**
124
+ * 参数差异项,表示某个 URL 参数从旧值变更为新值。
125
+ * 用于 Router.diff() 返回的差异比较结果中
126
+ */
127
+ export interface RouterDiffItem {
128
+ /**
129
+ * 变更前的旧值
130
+ */
131
+ readonly from: string;
132
+ /**
133
+ * 变更后的新值
134
+ */
135
+ readonly to: string;
136
+ }
137
+ /**
138
+ * URL 差异对象接口,描述两次路由状态之间的变化。
139
+ * 由 Router.diff() 返回,包含路径、视图及参数的详细差异信息
140
+ */
141
+ export interface RouterDiff {
142
+ /**
143
+ * 是否为应用首次初始化时强制触发的差异比较
144
+ */
145
+ readonly force: boolean;
146
+ /**
147
+ * 当路径有变化时,包含路径的差异信息
148
+ */
149
+ readonly path?: RouterDiffItem;
150
+ /**
151
+ * 当渲染的根视图有变化时,包含视图的差异信息
152
+ */
153
+ readonly view?: RouterDiffItem;
154
+ /**
155
+ * 所有发生变化的参数及其差异信息
156
+ */
157
+ readonly params: Readonly<Record<string, RouterDiffItem>>;
158
+ /**
159
+ * 是否有任何内容发生了变化
160
+ */
161
+ readonly changed: boolean;
162
+ }
163
+ /**
164
+ * 视图更新器接口,管理视图数据绑定与变更检测。
165
+ * 每个 View 实例持有一个 Updater,通过 set/digest 驱动界面更新。
166
+ * 内部执行模板渲染 → VDOM Diff → DOM 操作的完整流水线
167
+ */
168
+ export interface Updater {
169
+ /**
170
+ * 获取已设置的数据。当 key 未传递时返回整个数据对象;
171
+ * 当 key 传递时返回该键对应的值
172
+ * @param key 数据键名,省略则返回完整数据对象
173
+ */
174
+ get<T = unknown>(key?: string): T;
175
+ /**
176
+ * 设置数据并追踪变更的键。设置后需调用 digest() 才会将变更应用到界面。
177
+ * 返回 this 以支持链式调用
178
+ * @param data 数据对象,例如 `{ a: 20, b: 30 }`
179
+ * @param excludes 需要排除变更追踪的键集合
180
+ */
181
+ set(data: Record<string, unknown>, excludes?: Set<string>): this;
182
+ /**
183
+ * 检测数据变化并触发 VDOM 重新渲染。
184
+ * 放入数据后需显式调用该方法,界面才会更新。
185
+ * 内部执行模板渲染 → VDOM Diff → DOM 操作的完整流水线
186
+ * @param data 可选的数据对象,若提供则先调用 set() 设置数据
187
+ * @param excludes 需要排除变更追踪的键集合
188
+ * @param callback 渲染完成后的回调函数
189
+ */
190
+ digest(
191
+ data?: Record<string, unknown>,
192
+ excludes?: Set<string>,
193
+ callback?: () => void,
194
+ ): void;
195
+ /**
196
+ * 获取当前数据状态的快照,配合 altered() 方法可检测数据是否有变化
197
+ */
198
+ snapshot(): this;
199
+ /**
200
+ * 检测自上次 snapshot() 以来数据是否有变动。
201
+ * 若从未调用 snapshot(),则返回 undefined
202
+ */
203
+ altered(): boolean | undefined;
204
+ /**
205
+ * 翻译模板中 @ 符号对应的原始引用数据。
206
+ * 将以特殊分隔符开头的字符串替换为 refData 中的实际值
207
+ * @param data 待翻译的数据值
208
+ */
209
+ translate(data: unknown): unknown;
210
+ /**
211
+ * 在数据上下文中解析表达式字符串
212
+ * @param expr 表达式字符串
213
+ */
214
+ parse(expr: string): unknown;
215
+ }
216
+ /**
217
+ * 数据载体接口,包装 API 请求的响应数据,提供便捷的读写方法。
218
+ * Bag 实例由 Service 内部创建,开发者通过 all/one/save 回调获取
219
+ */
220
+ export interface Bag {
221
+ /**
222
+ * 从 Bag 中获取指定键的数据
223
+ * @param key 数据键名
224
+ */
225
+ get<T = unknown>(key: string): T;
226
+ /**
227
+ * 向 Bag 中设置数据,支持三种调用方式:
228
+ * - 传入键值对:`bag.set("name", "value")`
229
+ * - 传入数据对象:`bag.set({ name: "value" })`
230
+ * - 传入接口元信息对象(框架内部使用)
231
+ * 返回 this 以支持链式调用
232
+ * @param keyOrData 键名字符串、数据对象或接口元信息
233
+ * @param value 当第一个参数为键名时对应的值
234
+ */
235
+ set(
236
+ keyOrData: string | Record<string, unknown> | ServiceInterfaceMeta,
237
+ value?: unknown,
238
+ ): this;
239
+ }
240
+ /**
241
+ * State 数据变化事件接口,携带变更键的集合信息
242
+ */
243
+ export interface StateChangedEvent extends TriggerEventDescriptor {
244
+ /**
245
+ * 包含哪些数据键发生变化的集合对象,值为 1 表示该键发生了变化
246
+ */
247
+ readonly keys: Readonly<Record<string, 1>>;
248
+ }
249
+ /**
250
+ * 事件对象接口,提供 on/off/fire 方法实现发布-订阅模式
251
+ */
252
+ export interface Event<T = unknown> {
253
+ /**
254
+ * 绑定事件监听器。当事件触发时,处理器将被调用
255
+ * @param name 事件名称
256
+ * @param fn 事件处理函数
257
+ */
258
+ on(name: string, fn: (this: T, e?: TriggerEventDescriptor) => void): this;
259
+ /**
260
+ * 解除事件监听。若未传递处理函数,则移除该事件的所有监听器
261
+ * @param name 事件名称
262
+ * @param fn 可选的事件处理函数,省略则移除所有监听
263
+ */
264
+ off(name: string, fn?: (...args: unknown[]) => unknown): this;
265
+ /**
266
+ * 派发事件,执行所有已绑定的监听器。
267
+ * 事件数据中将自动添加 type 属性。支持在派发时移除所有监听器,
268
+ * 以及按倒序执行监听列表
269
+ * @param name 事件名称
270
+ * @param data 事件数据对象
271
+ * @param remove 是否在派发后移除所有监听器
272
+ * @param lastToFirst 是否倒序派发监听列表
273
+ */
274
+ fire(
275
+ name: string,
276
+ data?: Record<string, unknown>,
277
+ remove?: boolean,
278
+ lastToFirst?: boolean,
279
+ ): this;
280
+ }
281
+ /**
282
+ * 全局状态接口,提供跨视图的数据共享与变更通知能力。
283
+ * State 是一个单例对象,通过 get/set/digest 管理应用级状态数据。
284
+ * 支持 clean() 方法创建视图销毁时自动清理的 mixin
285
+ */
286
+ export interface State extends Event<State> {
287
+ /**
288
+ * 从全局状态中获取数据。当 key 未传递时返回整个状态对象
289
+ * @param key 数据键名,省略则返回完整状态对象
290
+ */
291
+ get<T = unknown>(key?: string): T;
292
+ /**
293
+ * 设置全局状态数据。设置后需调用 digest() 才会派发 changed 事件通知视图更新
294
+ * @param data 数据对象,例如 `{ a: 20, b: 30 }`
295
+ * @param excludes 需要排除变更追踪的键集合
296
+ */
297
+ set(data: Record<string, unknown>, excludes?: Set<string>): this;
298
+ /**
299
+ * 清理 State 中指定键的数据。只能在 view 的 mixins 中使用,
300
+ * 例如 `mixins: [Lark.State.clean("a,b")]`。
301
+ * 当视图销毁时,通过该方法注册的键将自动被清理,
302
+ * 同时减少对应键的引用计数,引用计数归零时自动删除该数据
303
+ * @param keys 逗号分隔的键名字符串
304
+ * @returns 包含 make 方法的对象,供 mixins 机制调用
305
+ */
306
+ clean(keys: string): { make: (...args: unknown[]) => unknown };
307
+ /**
308
+ * 检测数据变化并派发 changed 事件。
309
+ * 通过 set() 放入数据后需显式调用该方法,事件才会派发
310
+ * @param data 可选的数据对象,若提供则先调用 set() 设置数据
311
+ * @param excludes 需要排除变更追踪的键集合
312
+ */
313
+ digest(data?: Record<string, unknown>, excludes?: Set<string>): void;
314
+ /**
315
+ * State 中的数据发生变化时触发
316
+ */
317
+ onchanged: (this: this, e?: StateChangedEvent) => void;
318
+ }
319
+ /**
320
+ * 接口元信息配置,用于向 Service 注册一个 API 端点。
321
+ * 每个 meta 条目描述了接口的 URL、缓存策略、前后置钩子等
322
+ */
323
+ export interface ServiceInterfaceMeta {
324
+ /**
325
+ * 缓存有效时间,以毫秒为单位。0 表示不缓存,
326
+ * 大于 0 表示缓存 TTL(在该时间范围内复用缓存数据)
327
+ */
328
+ cache?: number;
329
+ /**
330
+ * 请求的 URL 地址(必填项)
331
+ */
332
+ url: string;
333
+ /**
334
+ * 接口元信息的唯一名称,需确保在同一个 Service 类中唯一
335
+ */
336
+ name: string;
337
+ /**
338
+ * 逗号分隔的接口名称字符串,用于清除其它接口的缓存。
339
+ * 例如该接口是一个新增数据的接口,调用成功后应清除
340
+ * 所有获取相关数据的缓存接口,否则将获取不到新数据
341
+ */
342
+ cleans?: string;
343
+ /**
344
+ * 请求发送前的钩子函数,可在该方法内对请求数据进行加工处理。
345
+ * this 指向当前 Bag 实例
346
+ * @param bag 当前请求的数据载体
347
+ */
348
+ before?: (this: Bag, bag: Bag) => void;
349
+ /**
350
+ * 请求成功后的钩子函数,在数据送达视图前调用,
351
+ * 可在该方法内对响应数据进行加工处理。
352
+ * this 指向当前 Bag 实例
353
+ * @param bag 当前请求的数据载体
354
+ */
355
+ after?: (this: Bag, bag: Bag) => void;
356
+ [key: string]: unknown;
357
+ }
358
+ /**
359
+ * 基础触发事件描述接口,所有事件对象的公共基础类型。
360
+ * 包含 type 属性标识事件类型名称
361
+ */
362
+ export interface TriggerEventDescriptor {
363
+ /**
364
+ * 事件类型名称
365
+ */
366
+ readonly type: string;
367
+ }
368
+ /**
369
+ * 路由变化前的事件接口(change 阶段),
370
+ * 提供两阶段确认机制:先触发 change(可拒绝),再触发 changed(已生效)。
371
+ * 开发者可通过此事件对象阻止、拒绝或接受路由变更
372
+ */
373
+ export interface RouterChangeEvent extends TriggerEventDescriptor {
374
+ /**
375
+ * 拒绝 URL 改变,恢复到之前的地址
376
+ */
377
+ reject: () => void;
378
+ /**
379
+ * 接受 URL 改变,继续导航
380
+ */
381
+ resolve: () => void;
382
+ /**
383
+ * 阻止 URL 改变,暂停后续路由处理
384
+ */
385
+ prevent: () => void;
386
+ }
387
+ /**
388
+ * 路由变化后的事件接口(changed 阶段),
389
+ * 携带路由差异信息。当路由变更确认后触发,此时 URL 已更新
390
+ */
391
+ export interface RouterChangedEvent
392
+ extends RouterDiff, TriggerEventDescriptor {}
393
+ /**
394
+ * 视图监听 URL 变化的配置接口。
395
+ * 用于 observeLocation() 方法的对象参数形式
396
+ */
397
+ export interface ViewObserveLocation {
398
+ /**
399
+ * 是否监听路径变化
400
+ */
401
+ path?: boolean;
402
+ /**
403
+ * 监听的参数键名,支持逗号分隔字符串或字符串数组
404
+ */
405
+ params?: string | string[];
406
+ }
407
+ /**
408
+ * 路由对象接口,提供 URL 解析、导航、差异比较及事件监听能力。
409
+ * 支持两阶段路由确认机制:change(可拒绝)→ changed(已生效)。
410
+ * 基于 Hash 实现,使用 #! 作为默认哈希前缀
411
+ */
412
+ export interface Router extends Event<Router> {
413
+ /**
414
+ * 解析 href 的 query 和 hash 部分,返回结构化的路由信息。
415
+ * 默认解析当前页面 location.href
416
+ * @param url 待解析的 URL,若未指定则使用 location.href
417
+ */
418
+ parse(url?: string): RouterParse;
419
+ /**
420
+ * 计算当前 URL 与上一个 URL 之间的差异对象。
421
+ * 如果尚未发生任何路由变化,返回 undefined
422
+ */
423
+ diff(): RouterDiff | undefined;
424
+ /**
425
+ * 导航到新的地址,支持路径字符串或参数对象两种调用方式:
426
+ * - `Router.to("/list", { page: 2 })` — 指定路径和参数
427
+ * - `Router.to({ page: 2 })` — 仅更新参数,保持当前路径
428
+ * @param pathOrParams 路径字符串或参数对象
429
+ * @param params 查询参数对象(仅当第一个参数为路径字符串时使用)
430
+ * @param replace 是否替换当前的历史记录(而非新增)
431
+ * @param silent 是否静默更新,不触发 change 事件
432
+ */
433
+ to(
434
+ pathOrParams: string | Record<string, unknown>,
435
+ params?: Record<string, unknown>,
436
+ replace?: boolean,
437
+ silent?: boolean,
438
+ ): void;
439
+ /**
440
+ * URL 即将改变时触发(change 阶段),可通过事件对象拒绝或阻止导航
441
+ */
442
+ onchange: (this: this, e?: RouterChangeEvent) => void;
443
+ /**
444
+ * URL 改变后触发(changed 阶段),携带路由差异信息
445
+ */
446
+ onchanged: (this: this, e?: RouterChangedEvent) => void;
447
+ }
448
+ /**
449
+ * 接口服务事件接口,在请求开始或结束时触发。
450
+ * 包含 begin/done/fail/end 四种事件
451
+ */
452
+ export interface ServiceEvent extends TriggerEventDescriptor {
453
+ /**
454
+ * 数据载体对象,包含本次请求的数据
455
+ */
456
+ readonly bag: Bag;
457
+ /**
458
+ * 错误对象,如果请求过程中发生错误则携带该信息,否则为 null
459
+ */
460
+ readonly error: object | string | null;
461
+ }
462
+ /**
463
+ * 继承属性描述接口,定义 extend() 方法中可传入的属性值类型约束。
464
+ * 支持基本类型、正则、符号、对象及函数
465
+ */
466
+ export type ExtendPropertyDescriptor<T> = Record<
467
+ string,
468
+ | string
469
+ | number
470
+ | undefined
471
+ | boolean
472
+ | RegExp
473
+ | symbol
474
+ | Record<string, unknown>
475
+ | null
476
+ | ((this: T, ...args: unknown[]) => unknown)
477
+ >;
478
+ /**
479
+ * 继承方法中的 this 指向类型,将 ExtendPropertyDescriptor 与 ThisType 结合
480
+ */
481
+ type TExtendPropertyDescriptor<T> = ExtendPropertyDescriptor<T> & ThisType<T>;
482
+ /**
483
+ * 继承静态属性描述接口,用于 extend() 方法的 statics 参数
484
+ */
485
+ export type ExtendStaticPropertyDescriptor = Record<string, unknown>;
486
+ /**
487
+ * 视图监听 URL 参数的配置接口(与 ViewObserveLocation 相同)
488
+ */
489
+ export interface ViewObserveUrl {
490
+ /**
491
+ * 监听的参数键名,支持逗号分隔字符串或字符串数组
492
+ */
493
+ params?: string | string[];
494
+ /**
495
+ * 是否监听路径变化
496
+ */
497
+ path?: boolean;
498
+ }
499
+ /**
500
+ * 视图事件接口,携带触发事件的节点 ID。
501
+ * 在通过 v-event 属性绑定的 DOM 事件中携带
502
+ */
503
+ export interface ViewEvent extends TriggerEventDescriptor {
504
+ /**
505
+ * 触发事件的 DOM 节点 ID
506
+ */
507
+ readonly id: string;
508
+ }
509
+ /**
510
+ * Frame 静态事件接口,携带关联的 Frame 实例。
511
+ * 在 Frame 的 add/remove 静态事件中携带
512
+ */
513
+ export interface FrameStaticEvent extends TriggerEventDescriptor {
514
+ /**
515
+ * 关联的 Frame 实例对象
516
+ */
517
+ readonly vframe: FramePrototype;
518
+ }
519
+ /**
520
+ * 缓存类原型接口,提供基于 LFU(最不经常使用)策略的缓存管理能力。
521
+ * 缓存键在内部使用特殊分隔符前缀进行命名空间隔离
522
+ */
523
+ export interface CachePrototype {
524
+ /**
525
+ * 设置缓存资源。若 key 已存在则更新对应资源值并增加访问频率。
526
+ * 当缓存条目数超过容量(maxSize + bufferSize)时,将触发 LFU 淘汰策略
527
+ * @param key 缓存资源的唯一标识键
528
+ * @param resource 要缓存的资源
529
+ */
530
+ set<T>(key: string, resource: T): void;
531
+ /**
532
+ * 获取缓存的资源。访问时会增加该条目的频率计数和时间戳,
533
+ * 以影响 LFU 排序。若不存在则返回 undefined
534
+ * @param key 缓存资源时使用的键
535
+ */
536
+ get<T = unknown>(key: string): T | undefined;
537
+ /**
538
+ * 从缓存中删除指定键的资源。删除时会触发 onRemove 回调
539
+ * @param key 要删除的缓存资源键
540
+ */
541
+ del(key: string): void;
542
+ /**
543
+ * 判断缓存中是否包含给定键的资源
544
+ * @param key 缓存资源键
545
+ */
546
+ has(key: string): boolean;
547
+ /**
548
+ * 遍历缓存中的所有资源值
549
+ * @param callback 遍历回调函数,参数为缓存值(可能为 undefined)
550
+ */
551
+ forEach<T = unknown>(callback: (value: T | undefined) => void): void;
552
+ /**
553
+ * 当前缓存中的条目数量
554
+ */
555
+ readonly size: number;
556
+ /**
557
+ * 清空缓存中的所有条目,每个被清除的条目都会触发 onRemove 回调
558
+ */
559
+ clear(): void;
560
+ }
561
+ /**
562
+ * 缓存类构造接口,创建基于 LFU 策略的缓存实例
563
+ */
564
+ export interface Cache {
565
+ /**
566
+ * 创建缓存实例
567
+ * @param options 缓存配置对象,包含 maxSize、bufferSize、onRemove 等选项
568
+ */
569
+ new (options?: {
570
+ maxSize?: number;
571
+ bufferSize?: number;
572
+ onRemove?: (key: string) => void;
573
+ sortComparator?: (a: unknown, b: unknown) => number;
574
+ }): CachePrototype;
575
+ readonly prototype: CachePrototype;
576
+ }
577
+ /**
578
+ * 拥有 on/off/fire 事件的基类原型接口。
579
+ * Base 类继承自 EventEmitter,可直接实例化使用
580
+ */
581
+ export type BasePrototype = Event<BasePrototype>;
582
+ /**
583
+ * 拥有 on/off/fire 事件的基类接口。
584
+ * Base 类继承自 EventEmitter,可直接实例化使用
585
+ */
586
+ export interface Base {
587
+ /**
588
+ * 创建 Base 实例
589
+ */
590
+ new (): BasePrototype;
591
+ /**
592
+ * 原型
593
+ */
594
+ readonly prototype: BasePrototype;
595
+ }
596
+ /**
597
+ * Frame 类原型接口。
598
+ * Frame(视图帧)是视图的容器,管理视图的挂载、卸载及父子层级关系。
599
+ * 每个 Frame 对应一个 DOM 节点,通过 lark-view 属性关联视图
600
+ */
601
+ export interface FramePrototype extends Event<FramePrototype> {
602
+ /**
603
+ * Frame 所在的 DOM 节点 ID
604
+ */
605
+ readonly id: string;
606
+ /**
607
+ * 当前 Frame 渲染的视图模块路径,例如 "app/views/default"
608
+ */
609
+ readonly viewPath?: string;
610
+ /**
611
+ * 父 Frame 的 ID,若为顶层 Frame 则为 undefined
612
+ */
613
+ readonly parentId: string | undefined;
614
+ /**
615
+ * 挂载视图到当前 Frame。框架将加载视图类、创建实例并完成渲染
616
+ * @param viewPath 视图模块路径,例如 "app/views/default"
617
+ * @param viewInitParams 初始化视图时传递的参数,可在视图的 init 方法中接收
618
+ */
619
+ mountView(viewPath: string, viewInitParams?: Record<string, unknown>): void;
620
+ /**
621
+ * 卸载当前 Frame 中的视图,触发视图的 destroy 事件并清理资源
622
+ */
623
+ unmountView(): void;
624
+ /**
625
+ * 在指定 DOM 节点上挂载子 Frame 并渲染视图
626
+ * @param id 要渲染的 DOM 节点 ID
627
+ * @param viewPath 视图路径
628
+ * @param viewInitParams 初始化视图时传递的参数
629
+ */
630
+ mountFrame(
631
+ id: string,
632
+ viewPath: string,
633
+ viewInitParams?: Record<string, unknown>,
634
+ ): this;
635
+ /**
636
+ * 卸载指定 DOM 节点上的子 Frame
637
+ * @param id DOM 节点 ID,默认卸载当前 Frame
638
+ */
639
+ unmountFrame(id?: string): void;
640
+ /**
641
+ * 渲染指定节点下的所有子视图(扫描 lark-view 属性并挂载)
642
+ * @param id DOM 节点 ID,默认为当前 Frame
643
+ * @param inner 是否为内部调用(框架内部使用)
644
+ */
645
+ mountZone(id?: string, inner?: boolean): void;
646
+ /**
647
+ * 卸载指定节点下的所有子视图
648
+ * @param id DOM 节点 ID,默认为当前 Frame
649
+ */
650
+ unmountZone(id?: string): void;
651
+ /**
652
+ * 获取祖先 Frame。默认获取父 Frame(level=1)
653
+ * @param level 向上查找的层级,默认为 1
654
+ */
655
+ parent(level?: number): this | undefined;
656
+ /**
657
+ * 获取当前 Frame 的所有子 Frame 的 ID 数组。
658
+ * 注意:数组中 ID 的位置并不固定
659
+ */
660
+ children(): string[];
661
+ /**
662
+ * 调用当前 Frame 中视图的指定方法。
663
+ * 若视图尚未渲染完成,调用将被延迟到渲染后执行
664
+ * @param name 方法名
665
+ * @param args 传递给方法的参数数组
666
+ */
667
+ invoke<TReturnType>(name: string, args?: unknown[]): TReturnType;
668
+ /**
669
+ * 子孙视图全部创建完成时触发
670
+ */
671
+ oncreated: (this: this, e?: TriggerEventDescriptor) => void;
672
+ /**
673
+ * 子孙视图发生变更时触发
674
+ */
675
+ onalter: (this: this, e?: TriggerEventDescriptor) => void;
676
+ }
677
+ /**
678
+ * Frame 类接口(静态侧)。
679
+ * 开发者不需要继承或实例化该类,框架内部自动管理 Frame 的生命周期
680
+ */
681
+ export interface Frame extends Event<Frame> {
682
+ /**
683
+ * 获取当前页面上所有的 Frame 实例映射表
684
+ */
685
+ getAll(): Map<string, FramePrototype>;
686
+ /**
687
+ * 根据 ID 获取 Frame 实例,若不存在返回 undefined
688
+ * @param id Frame 的 DOM 节点 ID
689
+ */
690
+ get(id: string): FramePrototype | undefined;
691
+ /**
692
+ * 当 Frame 创建并注册时触发
693
+ */
694
+ onadd: (this: this, e?: FrameStaticEvent) => void;
695
+ /**
696
+ * 当 Frame 销毁并注销时触发
697
+ */
698
+ onremove: (this: this, e?: FrameStaticEvent) => void;
699
+ /**
700
+ * 原型
701
+ */
702
+ readonly prototype: FramePrototype;
703
+ }
704
+ /**
705
+ * 视图类原型接口,定义视图实例可用的属性和方法。
706
+ * 视图通过 View.extend() 创建子类,由 Frame 负责实例化和生命周期管理。
707
+ * 支持事件方法模式(如 `'name<click>'`)、资源托管和异步回调安全
708
+ */
709
+ export interface ViewPrototype extends Event<ViewPrototype> {
710
+ /**
711
+ * 当前视图所在的 DOM 节点 ID
712
+ */
713
+ readonly id: string;
714
+ /**
715
+ * 视图模板,支持函数模板或字符串模板。
716
+ * 函数模板签名:(data, viewId, refData, encodeHTML, ...) => string
717
+ */
718
+ readonly template?: ((...args: unknown[]) => string) | string;
719
+ /**
720
+ * 持有当前视图的 Frame 实例。
721
+ * 在视图初始化完成前可能为数字占位符(0)
722
+ */
723
+ readonly owner: FramePrototype | number;
724
+ /**
725
+ * 更新器实例,管理视图的数据绑定与 VDOM 渲染
726
+ */
727
+ readonly updater: Updater;
728
+ /**
729
+ * 混入的视图原型链上的其它对象数组,用于扩展视图功能。
730
+ * 框架会将 mixins 中的属性和方法合并到视图原型上,
731
+ * 事件方法模式的冲突会自动合并为串行调用
732
+ */
733
+ mixins?: ExtendStaticPropertyDescriptor[];
734
+ /**
735
+ * 初始化视图时调用。框架在挂载视图后自动调用此方法,
736
+ * 开发者可在此处执行初始化逻辑。
737
+ * 实际调用时框架会传入两个参数:initParams(初始化参数对象)和
738
+ * options(包含 node: Element 和 deep: boolean)
739
+ */
740
+ init(): void;
741
+ /**
742
+ * 渲染界面。框架在 init() 之后自动调用此方法,
743
+ * 开发者在此方法内完成界面渲染流程(通常调用 updater.digest())
744
+ */
745
+ render(): void;
746
+ /**
747
+ * 增量更新视图的 DOM。框架内部使用 VDOM Diff 机制,
748
+ * 仅更新发生变化的部分,并自动处理子视图的挂载与卸载。
749
+ * 返回 true 表示有 DOM 变更,undefined 表示无变更
750
+ * @param options 增量更新配置(框架内部使用)
751
+ */
752
+ assign(options?: unknown): boolean | undefined;
753
+ /**
754
+ * 监听地址栏的变化。支持两种调用方式:
755
+ * - `observeLocation("page,size", true)` — 传入参数键名和是否监听路径
756
+ * - `observeLocation({ params: ["page", "size"], path: true })` — 传入配置对象
757
+ * 当监听的参数或路径变化时,视图将自动重新渲染
758
+ * @param parameters 监听的参数键名,支持逗号分隔字符串或字符串数组;
759
+ * 或传入配置对象
760
+ * @param observePath 是否监听路径变化
761
+ */
762
+ observeLocation(
763
+ parameters: string | string[] | Record<string, unknown>,
764
+ observePath?: boolean,
765
+ ): void;
766
+ /**
767
+ * 监听 Lark.State 中指定键的数据变化。
768
+ * 当被监听的键通过 State.digest() 更新时,视图将自动重新渲染
769
+ * @param keys 逗号分隔的键名字符串,或字符串数组
770
+ */
771
+ observeState(keys: string | string[]): void;
772
+ /**
773
+ * 通知当前视图某个区域即将开始 HTML 更新。
774
+ * 内部会卸载该区域内的子 Frame,防止 VDOM Diff 时操作已卸载的节点
775
+ * @param id 需要更新的区域节点 ID,默认为当前视图
776
+ */
777
+ beginUpdate(id?: string): void;
778
+ /**
779
+ * 通知当前视图某个区域的 HTML 更新已完成。
780
+ * 内部会挂载该区域内的子 Frame,并执行延迟调用队列(invokes)
781
+ * @param id 更新完成的区域节点 ID,默认为当前视图
782
+ * @param inner 是否为内部调用
783
+ */
784
+ endUpdate(id?: string, inner?: boolean): void;
785
+ /**
786
+ * 包装异步回调函数,确保回调在视图未被销毁时才执行。
787
+ * 在单页应用中,异步回调(如 setTimeout、AJAX)执行时视图可能已销毁,
788
+ * 直接操作 DOM 会导致错误。使用 wrapAsync 包装后,Lark 会自动检查
789
+ * 视图状态,仅在视图存活时执行回调
790
+ * @param callback 待包装的回调函数
791
+ * @param context 回调执行时的 this 指向,默认为视图自身
792
+ */
793
+ wrapAsync<Fn extends (...args: unknown[]) => unknown>(
794
+ callback: Fn,
795
+ context?: unknown,
796
+ ): (...args: Parameters<Fn>) => ReturnType<Fn> | undefined;
797
+ /**
798
+ * 将资源交由当前视图托管。当视图销毁或重新渲染时,
799
+ * 框架会在合适的时机自动调用资源的 destroy 方法
800
+ * @param key 托管资源的唯一键。若该键已托管不同资源,旧资源将被自动销毁
801
+ * @param resource 待托管的资源对象
802
+ * @param destroyOnRender 当 render 方法再次调用时是否自动销毁该资源。
803
+ * 通常 Lark.Service 实例需要在 render 时自动销毁
804
+ */
805
+ capture(
806
+ key: string,
807
+ resource?: unknown,
808
+ destroyOnRender?: boolean,
809
+ ): unknown;
810
+ /**
811
+ * 释放已托管的资源。返回被托管的资源对象,无论是否已销毁
812
+ * @param key 托管资源的键
813
+ * @param destroy 是否销毁资源(调用其 destroy 方法),默认为 true
814
+ */
815
+ release(key: string, destroy?: boolean): unknown;
816
+ /**
817
+ * 设置离开提醒。例如表单有未保存的变更时,
818
+ * 可提示用户选择直接离开还是保存后再离开。
819
+ * 框架将在路由变化(change 阶段)和页面卸载(beforeunload)时
820
+ * 调用 condition 函数,若返回 true 则阻止导航
821
+ * @param message 离开提示消息
822
+ * @param condition 判断是否显示提示的函数,返回 true 表示需要阻止导航
823
+ */
824
+ leaveTip(message: string, condition: () => boolean): void;
825
+ /**
826
+ * 视图销毁时触发
827
+ */
828
+ ondestroy: (this: this, e?: TriggerEventDescriptor) => void;
829
+ /**
830
+ * 当 render 方法被调用时触发
831
+ */
832
+ onrendercall: (this: this, e?: TriggerEventDescriptor) => void;
833
+ }
834
+ /**
835
+ * View 类接口(静态侧),提供视图的继承与扩展能力。
836
+ * View.extend() 是创建视图子类的唯一入口
837
+ */
838
+ export interface View {
839
+ /**
840
+ * 继承 Lark.View 创建新的视图子类。
841
+ * 支持 props.make 构造器、props.mixins 混入、
842
+ * 以及事件方法模式(如 `'name<click>'`)
843
+ * @param props 包含 init、render 等方法的原型属性对象
844
+ * @param statics 静态方法或属性的对象
845
+ */
846
+ extend<TProps = object, TStatics = object>(
847
+ props?: TExtendPropertyDescriptor<TProps & ViewPrototype>,
848
+ statics?: TStatics,
849
+ ): this & TStatics;
850
+ /**
851
+ * 将多个混入对象合并到 Lark.View 原型上。
852
+ * 已有的属性不会被覆盖,事件方法模式的冲突会自动合并
853
+ * @param args 混入对象列表
854
+ */
855
+ merge(...args: TExtendPropertyDescriptor<ViewPrototype>[]): this;
856
+ /**
857
+ * 原型
858
+ */
859
+ readonly prototype: ViewPrototype;
860
+ }
861
+ /**
862
+ * 接口管理类原型接口,提供 Service 实例的请求与队列管理能力
863
+ */
864
+ export interface ServicePrototype {
865
+ /**
866
+ * 并行发起所有请求,当全部完成(无论成功或失败)后回调。
867
+ * 如果接口指定了缓存且缓存有效,将直接使用缓存数据
868
+ * @param metas 接口名称字符串、参数对象或它们的数组
869
+ * @param done 完成回调,第一个参数为错误数组,后续为各接口的 Bag
870
+ */
871
+ all(
872
+ metas:
873
+ | string
874
+ | Record<string, unknown>
875
+ | (string | Record<string, unknown>)[],
876
+ done: (...args: unknown[]) => unknown,
877
+ ): this;
878
+ /**
879
+ * 与 all 类似,但始终跳过缓存,强制发起实际请求
880
+ * @param metas 接口名称字符串、参数对象或它们的数组
881
+ * @param done 完成回调
882
+ */
883
+ save(
884
+ metas:
885
+ | string
886
+ | Record<string, unknown>
887
+ | (string | Record<string, unknown>)[],
888
+ done: (...args: unknown[]) => unknown,
889
+ ): this;
890
+ /**
891
+ * 任意一个请求成功即立即回调,回调可能被调用多次
892
+ * @param metas 接口名称字符串、参数对象或它们的数组
893
+ * @param done 完成回调
894
+ */
895
+ one(
896
+ metas:
897
+ | string
898
+ | Record<string, unknown>
899
+ | (string | Record<string, unknown>)[],
900
+ done: (...args: unknown[]) => unknown,
901
+ ): this;
902
+ /**
903
+ * 排队执行任务。前一个 all/one/save 任务完成后,再执行下一个任务,类似 Promise 链
904
+ * @param callback 当前面的任务完成后调用的回调函数
905
+ */
906
+ enqueue(callback: (...args: unknown[]) => unknown): this;
907
+ /**
908
+ * 开始处理队列中的下一个任务
909
+ */
910
+ dequeue(...args: unknown[]): void;
911
+ /**
912
+ * 销毁当前 Service 实例。销毁后不可继续发起新请求,也不再调用回调
913
+ */
914
+ destroy(): void;
915
+ }
916
+ /**
917
+ * 接口管理类接口(静态侧),提供 API 端点注册、缓存管理和请求调度能力。
918
+ * 使用前需先通过 extend() 绑定数据同步函数,再通过 add() 注册接口元信息
919
+ */
920
+ export interface Service extends Event<Service> {
921
+ /**
922
+ * 继承产生新的 Service 子类,绑定自定义的数据同步函数
923
+ * @param sync 同步数据的方法,通常在该方法内与服务端交换数据
924
+ * @param cacheMax 最大缓存条目数
925
+ * @param cacheBuffer 缓存缓冲区大小
926
+ */
927
+ extend(
928
+ sync: (bag: Bag, callback: () => void) => void,
929
+ cacheMax?: number,
930
+ cacheBuffer?: number,
931
+ ): this;
932
+ /**
933
+ * 添加接口元信息,注册一个或多个 API 端点
934
+ * @param metas 接口元信息数组,也支持单个元信息对象
935
+ */
936
+ add(metas: ServiceInterfaceMeta | ServiceInterfaceMeta[]): void;
937
+ /**
938
+ * 根据接口元信息创建 Bag 对象
939
+ * @param meta 接口元信息对象或名称字符串
940
+ */
941
+ create(meta: Record<string, unknown>): Bag;
942
+ /**
943
+ * 获取元信息对象
944
+ * @param meta 接口元信息对象或名称字符串
945
+ */
946
+ meta(meta: string | Record<string, unknown>): ServiceInterfaceMeta;
947
+ /**
948
+ * 从缓存中获取或创建 Bag 对象
949
+ * @param meta 接口元信息对象
950
+ * @param createNew 是否创建新的 Bag 对象,若为 false 则优先从缓存中获取
951
+ */
952
+ get(
953
+ meta: Record<string, unknown>,
954
+ createNew?: boolean,
955
+ ): { entity: Bag; needsUpdate: boolean };
956
+ /**
957
+ * 从缓存中清除指定接口的数据
958
+ * @param names 逗号分隔的接口名称字符串或字符串数组
959
+ */
960
+ clear(names: string | string[]): void;
961
+ /**
962
+ * 从缓存中获取 Bag 对象,若缓存不存在或已过期则返回 undefined
963
+ * @param meta 接口元信息对象
964
+ */
965
+ cached(meta: Record<string, unknown>): Bag | undefined;
966
+ /**
967
+ * 接口发送请求前触发
968
+ */
969
+ onbegin: (this: this, e?: ServiceEvent) => void;
970
+ /**
971
+ * 接口请求结束时触发,无论成功或失败
972
+ */
973
+ onend: (this: this, e?: ServiceEvent) => void;
974
+ /**
975
+ * 创建 Service 实例
976
+ */
977
+ new (): ServicePrototype;
978
+ /**
979
+ * 原型
980
+ */
981
+ readonly prototype: ServicePrototype;
982
+ }
983
+ /**
984
+ * Lark 框架主对象接口,提供全局配置、应用初始化及工具方法。
985
+ * 作为 @lark.js/mvc 模块的默认导出
986
+ */
987
+ export interface Lark {
988
+ /**
989
+ * 设置或获取配置信息。
990
+ * - 传入配置对象时合并配置并返回合并后的配置
991
+ * - 传入字符串键名时返回该键对应的配置值
992
+ * - 不传参数时返回完整配置信息对象
993
+ * @param cfg 配置信息参数对象或配置键名
994
+ */
995
+ config<T extends object = Config>(cfg?: Config & T): Config & T;
996
+ config(key: string): unknown;
997
+ /**
998
+ * 应用初始化入口,启动框架并渲染根视图。
999
+ * 调用后将执行:合并配置 → 绑定路由事件 → 创建根 Frame → 挂载默认视图
1000
+ * @param cfg 配置信息参数对象
1001
+ */
1002
+ boot(cfg: Config): void;
1003
+ /**
1004
+ * 将数组转换为哈希映射对象。
1005
+ * - 简单数组:`Lark.toMap([1,2,3])` => `{1:1, 2:1, 3:1}`
1006
+ * - 对象数组:`Lark.toMap([{id:20},{id:30}], 'id')` => `{20:{id:20}, 30:{id:30}}`
1007
+ * @param list 源数组
1008
+ * @param key 以数组中对象的哪个键的值作为哈希的键
1009
+ */
1010
+ toMap<T>(
1011
+ list: T[] | null | undefined,
1012
+ key?: keyof T,
1013
+ ): Record<string, T | number>;
1014
+ /**
1015
+ * 以 try-catch 方式执行方法,忽略任何异常。
1016
+ * 返回成功执行的最后一个方法的返回值
1017
+ * @param fns 函数或函数数组
1018
+ * @param args 传递给函数的参数数组
1019
+ * @param context 函数执行时的 this 指向
1020
+ */
1021
+ toTry(
1022
+ fns:
1023
+ | ((...args: unknown[]) => unknown)
1024
+ | ((...args: unknown[]) => unknown)[],
1025
+ args?: unknown[],
1026
+ context?: unknown,
1027
+ ): unknown;
1028
+ /**
1029
+ * 将路径和参数转换为 URL 字符串。
1030
+ * 例如 `Lark.toUrl('/xxx/', {a:'b',c:'d'})` => `/xxx/?a=b&c=d`
1031
+ * @param path 路径字符串
1032
+ * @param params 参数对象
1033
+ * @param keepEmpty 保留空白值的键集合
1034
+ */
1035
+ toUrl(
1036
+ path: string,
1037
+ params?: Record<string, unknown>,
1038
+ keepEmpty?: Record<string, number>,
1039
+ ): string;
1040
+ /**
1041
+ * 将 URL 字符串解析为路径和参数对象。
1042
+ * 例如 `Lark.parseUrl('/xxx/?a=b&c=d')` => `{path:'/xxx/', params:{a:'b',c:'d'}}`
1043
+ * @param url URL 字符串
1044
+ */
1045
+ parseUrl(url: string): LarkMvc.RouterParseParts;
1046
+ /**
1047
+ * 将源对象的属性合并到目标对象上
1048
+ * @param target 目标对象
1049
+ * @param sources 一个或多个源对象
1050
+ */
1051
+ mix<T extends object>(target: T, ...sources: Partial<T>[]): T;
1052
+ /**
1053
+ * 检测对象是否拥有指定的自身属性(安全版 hasOwnProperty)
1054
+ * @param owner 检测对象,支持 undefined/null
1055
+ * @param prop 属性键名
1056
+ */
1057
+ has<T extends object>(
1058
+ owner: T | undefined | null,
1059
+ prop: PropertyKey,
1060
+ ): boolean;
1061
+ /**
1062
+ * 获取对象自身可枚举属性的键名数组
1063
+ * @param src 源对象
1064
+ */
1065
+ keys<T extends object>(src: T): string[];
1066
+ /**
1067
+ * 判断一个 DOM 节点是否包含在另一个节点内。
1068
+ * 若两个节点为同一节点,也返回 true
1069
+ * @param node 节点或节点 ID
1070
+ * @param container 容器节点或节点 ID
1071
+ */
1072
+ inside(
1073
+ node: HTMLElement | string,
1074
+ container: HTMLElement | string,
1075
+ ): boolean;
1076
+ /**
1077
+ * document.getElementById 的简写。
1078
+ * 若传入的已是 Element 则直接返回
1079
+ * @param id 节点 ID 或 Element 对象
1080
+ */
1081
+ node(id: string | Element | null): Element | null;
1082
+ /**
1083
+ * 确保 DOM 元素拥有 ID,若不存在则自动生成一个。
1084
+ * 返回元素的 ID
1085
+ * @param node DOM 元素对象
1086
+ */
1087
+ nodeId(node: HTMLElement): string;
1088
+ /**
1089
+ * 使用配置的模块加载器加载模块
1090
+ * @param names 模块名称,支持字符串或字符串数组
1091
+ * @param callback 模块加载完成后的回调
1092
+ */
1093
+ use(
1094
+ names: string | string[],
1095
+ callback?: (...modules: unknown[]) => void,
1096
+ ): void;
1097
+ /**
1098
+ * 在调试模式下保护对象不被直接修改。
1099
+ * 使用 Proxy 包装数据对象,拦截读写操作并给出警告,
1100
+ * 引导开发者使用 State.set/digest 进行状态管理。
1101
+ * 仅在 window.__lark_Debug 为 true 且 Proxy 可用时生效
1102
+ * @param o 待保护的对象
1103
+ */
1104
+ guard<T extends object>(o: T): T;
1105
+ /**
1106
+ * 向页面动态注入 CSS 样式。返回一个清理函数用于移除注入的样式。
1107
+ * 支持单条注入和批量注入两种方式:
1108
+ * - `Lark.applyStyle("my-style", "body { color: red; }")` — 单条注入
1109
+ * - `Lark.applyStyle(["style1", "css1", "style2", "css2"])` — 批量注入
1110
+ * @param styleIdOrPairs 样式唯一键或 [id1, css1, id2, css2, ...] 批量数组
1111
+ * @param cssText CSS 样式字符串(仅当第一个参数为字符串时使用)
1112
+ */
1113
+ applyStyle(styleIdOrPairs: string | string[], cssText?: string): () => void;
1114
+ /**
1115
+ * 生成全局唯一标识符(GUID)
1116
+ * @param prefix GUID 前缀,默认为 "mx-"
1117
+ */
1118
+ guid(prefix?: string): string;
1119
+ /**
1120
+ * 创建异步回调有效性标记。
1121
+ * 返回一个检查函数,若宿主对象被取消标记(例如视图重新渲染),
1122
+ * 则检查函数返回 false,可防止过期的异步回调执行。
1123
+ * 典型用法:`const check = Lark.mark(this, 'render'); setTimeout(() => { if (check()) ... })`
1124
+ * @param host 宿主对象(通常是视图实例)
1125
+ * @param key 标记键名(通常是 "render" 或特定异步操作标识)
1126
+ */
1127
+ mark(host: object, key: string): () => boolean;
1128
+ /**
1129
+ * 延时等待,基于 Promise 的 setTimeout 封装。
1130
+ * 配合 async/await 使用可简化异步流程控制
1131
+ * @param time 延时时间(毫秒)
1132
+ */
1133
+ delay(time: number): Promise<void>;
1134
+ /**
1135
+ * 接口服务管理类
1136
+ */
1137
+ Service: LarkMvc.Service;
1138
+ /**
1139
+ * 视图类
1140
+ */
1141
+ View: LarkMvc.View;
1142
+ /**
1143
+ * 缓存类
1144
+ */
1145
+ Cache: LarkMvc.Cache;
1146
+ /**
1147
+ * 全局状态对象
1148
+ */
1149
+ State: LarkMvc.State;
1150
+ /**
1151
+ * 事件对象
1152
+ */
1153
+ Event: LarkMvc.Event;
1154
+ /**
1155
+ * 路由对象
1156
+ */
1157
+ Router: LarkMvc.Router;
1158
+ /**
1159
+ * Frame 类,开发者不需要继承或实例化该类
1160
+ */
1161
+ Frame: LarkMvc.Frame;
1162
+ /**
1163
+ * 拥有 on/off/fire 事件的基类
1164
+ */
1165
+ Base: LarkMvc.Base;
1166
+ default: Lark;
1167
+ }
1168
+ }
1169
+ /**
1170
+ * 模块导出声明。
1171
+ * 通过 `import Lark from '@lark.js/mvc'` 引入框架主对象
1172
+ */
1173
+ declare module "@lark.js/mvc" {
1174
+ const Lark: LarkMvc.Lark;
1175
+ export = Lark;
1176
+ }