annil 1.5.4 → 1.5.6
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/CHANGELOG.md +14 -0
- package/README.md +7 -5
- package/dist/api/DefineComponent/collectOptionsForComponent.d.ts +1 -1
- package/dist/api/DefineComponent/collectOptionsForComponent.js +7 -9
- package/dist/api/DefineComponent/collectOptionsForComponent.js.map +1 -1
- package/dist/api/RootComponent/Properties/PropertiesValueValidator.d.ts +2 -1
- package/package.json +1 -1
- package/src/api/DefineComponent/collectOptionsForComponent.ts +17 -21
- package/src/api/RootComponent/Properties/PropertiesValueValidator.ts +2 -1
- package/src/api/RootComponent/Properties/test/normalOptional.test.ts +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
* 解决DetailedType不接收接口类型的错误 ([ae8acbf](https://github.com/missannil/annil/commit/ae8acbfc2e62f99db565c448ad9253aa549e78bb))
|
|
6
6
|
|
|
7
|
+
## [1.5.6](https://github.com/missannil/annil/compare/v1.5.5...v1.5.6) (2024-01-03)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* 修复RootCOmonent在properties的可选数组类型时,value验证错误的问题 ([b836e83](https://github.com/missannil/annil/commit/b836e83916a6649b004646893ad91350787c9421))
|
|
13
|
+
|
|
14
|
+
## [1.5.5](https://github.com/missannil/annil/compare/v1.5.4...v1.5.5) (2024-01-01)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* 修复isPage错误 ([301366d](https://github.com/missannil/annil/commit/301366d9b30f909c59db727db53847bd789cb144))
|
|
20
|
+
|
|
7
21
|
## [1.5.4](https://github.com/missannil/annil/compare/v1.5.3...v1.5.4) (2023-12-25)
|
|
8
22
|
|
|
9
23
|
|
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ annil(安奈儿)是微信小程序原生开发插件,相较于原生API,使用an
|
|
|
29
29
|
|
|
30
30
|
- **组件构建API功能更强大**
|
|
31
31
|
|
|
32
|
-
新的组件构建API加入了[computed](./doc/
|
|
32
|
+
新的组件构建API加入了[computed](./doc/demo/computed.md)、[watch](./doc/demo/watch.md)、[store](./doc/demo/store.md)(基于mobx的全局响应式数据)`等功能,使开发更便捷。
|
|
33
33
|
|
|
34
34
|
- **复杂组件解决方案**
|
|
35
35
|
|
|
@@ -42,10 +42,6 @@ annil(安奈儿)是微信小程序原生开发插件,相较于原生API,使用an
|
|
|
42
42
|
|
|
43
43
|
新的组件构建API(DefineComponent)返回的类型叫组件(文档)类型,好比传统组件(UI)库为每个组件书写的使用文档,在做为子组件构建新组件(页面)时,子组件API(SubComponent)要求使用者输入组件类型,在定义选项字段时,会得到类型提示、约束和检测。这样实现了一个页面中所有子组件之间的类型耦合,无论组件嵌套多少层,无论哪层组件数据类型发生改变,所有相关组件类型都会得到感知。当您增改、重构代码时,只要无类型报错(tsc --noEmit --watch)就不会有运行时报错的心智负担。
|
|
44
44
|
|
|
45
|
-
- **类型约束书写规范**
|
|
46
|
-
|
|
47
|
-
annil通过类型来约束代码书写规范,例如在js开发时可以通过`this.setData({...})`新增一个未在data字段中定义的数据或修改properties中定义的数据,这显然是不对的。新API通过类型报错的形式约束[书写规范](./doc/designIdea.md),在特定情形下(例如测试)你可以通过 `//@ts-ignore`或`as any`关闭类型检测。
|
|
48
|
-
|
|
49
45
|
- **高兼容性**
|
|
50
46
|
|
|
51
47
|
annil提供的API都是原生API的语法糖,不具有强制性和侵入性,可渐进性使用或重构代码。
|
|
@@ -58,6 +54,10 @@ annil(安奈儿)是微信小程序原生开发插件,相较于原生API,使用an
|
|
|
58
54
|
|
|
59
55
|
第三方组件库一般都是以文档的形式对组件说明,插件提供了泛型[GenerateDoc](./src/types/GenerateDoc.ts),可根据组件文档快速书写组件类型,使第三方组件融入组件构建模型,后续插件会陆续添加原生(Wm)和常用第三方组件库(Vant)类型。
|
|
60
56
|
|
|
57
|
+
- **设计思想**
|
|
58
|
+
|
|
59
|
+
请参考[设计思想](./doc/designIdea.md)
|
|
60
|
+
|
|
61
61
|
### 安装
|
|
62
62
|
|
|
63
63
|
1. 依赖安装
|
|
@@ -130,6 +130,8 @@ annil(安奈儿)是微信小程序原生开发插件,相较于原生API,使用an
|
|
|
130
130
|
|
|
131
131
|
[navigateTo](./doc/api/navigateTo.md)
|
|
132
132
|
|
|
133
|
+
- 实用类型
|
|
134
|
+
|
|
133
135
|
### 更新日志
|
|
134
136
|
|
|
135
137
|
[CHANGELOG](./CHANGELOG.md)
|
|
@@ -18,6 +18,7 @@ export type FinalOptionsOfComponent = {
|
|
|
18
18
|
__computedInitCache__?: () => ComputedCache;
|
|
19
19
|
};
|
|
20
20
|
externalClasses: string[];
|
|
21
|
+
pageLifetimes: PageLifetimesOption<false, object>["pageLifetimes"] & {};
|
|
21
22
|
isPage?: boolean;
|
|
22
23
|
options?: WMComponent.Options;
|
|
23
24
|
properties?: PropertiesConstraint;
|
|
@@ -25,7 +26,6 @@ export type FinalOptionsOfComponent = {
|
|
|
25
26
|
computed?: ComputedConstraint;
|
|
26
27
|
watch?: Record<string, Func>;
|
|
27
28
|
lifetimes?: LifetimesConstraint;
|
|
28
|
-
pageLifetimes?: PageLifetimesOption<false, object>["pageLifetimes"];
|
|
29
29
|
};
|
|
30
30
|
export declare function isPageCheck(isPage: boolean | undefined): (this: Instance) => void;
|
|
31
31
|
export declare function collectOptionsForComponent(defineComponentOption: DefineComponentOption): FinalOptionsOfComponent;
|
|
@@ -38,18 +38,15 @@ function loadReceivedDataHandle(option) {
|
|
|
38
38
|
}
|
|
39
39
|
option[INNERMARKER.url] = INNERMARKER.url;
|
|
40
40
|
}
|
|
41
|
-
function hijack(config, field, before
|
|
41
|
+
function hijack(config, field, before) {
|
|
42
42
|
const originalFunc = config[field];
|
|
43
43
|
config[field] = function (...args) {
|
|
44
44
|
before.forEach(func => func.call(this, ...args));
|
|
45
45
|
originalFunc && originalFunc.apply(this, args);
|
|
46
|
-
after.forEach(func => func.call(this, ...args));
|
|
47
46
|
};
|
|
48
47
|
return;
|
|
49
48
|
}
|
|
50
49
|
function InternalFieldProtection(config, keys) {
|
|
51
|
-
if (!config)
|
|
52
|
-
return;
|
|
53
50
|
const methodsConfigKeys = Object.keys(config);
|
|
54
51
|
for (const key of keys) {
|
|
55
52
|
if (methodsConfigKeys.includes(key)) {
|
|
@@ -71,7 +68,7 @@ function funcOptionsHandle(finalOptionsForComponent, isPage, funcOptions) {
|
|
|
71
68
|
}
|
|
72
69
|
else {
|
|
73
70
|
!(isEmptyObject(funcOptions.pageLifetimes))
|
|
74
|
-
&& _funcOptionsHandle(finalOptionsForComponent.pageLifetimes
|
|
71
|
+
&& _funcOptionsHandle(finalOptionsForComponent.pageLifetimes, funcOptions.pageLifetimes);
|
|
75
72
|
}
|
|
76
73
|
funcOptions.lifetimes && _funcOptionsHandle(finalOptionsForComponent.lifetimes || (finalOptionsForComponent.lifetimes = {}), funcOptions.lifetimes);
|
|
77
74
|
funcOptions.watch && _funcOptionsHandle(finalOptionsForComponent.watch || (finalOptionsForComponent.watch = {}), funcOptions.watch);
|
|
@@ -161,12 +158,13 @@ function merge(target, source) {
|
|
|
161
158
|
export function collectOptionsForComponent(defineComponentOption) {
|
|
162
159
|
const rootComponentOption = defineComponentOption.rootComponent;
|
|
163
160
|
const subComponentsList = defineComponentOption.subComponents;
|
|
164
|
-
const finalOptionsForComponent = merge(
|
|
161
|
+
const finalOptionsForComponent = merge(Object.assign({}, instanceConfig.injectInfo), {
|
|
165
162
|
observers: {},
|
|
166
163
|
data: {},
|
|
167
164
|
methods: {},
|
|
168
165
|
behaviors: [BStore, BComputedAndWatch],
|
|
169
166
|
externalClasses: [],
|
|
167
|
+
pageLifetimes: {},
|
|
170
168
|
});
|
|
171
169
|
const funcOptions = {
|
|
172
170
|
pageLifetimes: {},
|
|
@@ -182,9 +180,9 @@ export function collectOptionsForComponent(defineComponentOption) {
|
|
|
182
180
|
funcOptionsHandle(finalOptionsForComponent, rootComponentOption === null || rootComponentOption === void 0 ? void 0 : rootComponentOption.isPage, funcOptions);
|
|
183
181
|
InternalFieldProtection(finalOptionsForComponent.methods, ["disposer"]);
|
|
184
182
|
finalOptionsForComponent.isPage
|
|
185
|
-
&& hijack(finalOptionsForComponent.pageLifetimes
|
|
186
|
-
hijack(finalOptionsForComponent.methods, "onLoad", [onLoadReceivedDataHandle]
|
|
187
|
-
hijack(finalOptionsForComponent.lifetimes, "attached", [isPageCheck(rootComponentOption === null || rootComponentOption === void 0 ? void 0 : rootComponentOption.isPage)]
|
|
183
|
+
&& hijack(finalOptionsForComponent.pageLifetimes, "load", [loadReceivedDataHandle]);
|
|
184
|
+
hijack(finalOptionsForComponent.methods, "onLoad", [onLoadReceivedDataHandle]);
|
|
185
|
+
hijack(finalOptionsForComponent.lifetimes, "attached", [isPageCheck(rootComponentOption === null || rootComponentOption === void 0 ? void 0 : rootComponentOption.isPage)]);
|
|
188
186
|
finalOptionsForComponent.isPage
|
|
189
187
|
&& finalOptionsForComponent.options && Reflect.deleteProperty(finalOptionsForComponent.options, "virtualHost");
|
|
190
188
|
finalOptionsForComponent.behaviors.push(BBeforeCreate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectOptionsForComponent.js","sourceRoot":"","sources":["../../../src/api/DefineComponent/collectOptionsForComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"collectOptionsForComponent.js","sourceRoot":"","sources":["../../../src/api/DefineComponent/collectOptionsForComponent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { EmptyObject } from "hry-types/src/Misc/EmptyObject";
|
|
2
|
+
import type { NonReadonly } from "hry-types/src/Object/NonReadonly";
|
|
2
3
|
import type { InferDetailedType } from "../../../types/InferDetailedType";
|
|
3
4
|
export type PropertiesValueValidator<TProperties, Result = {
|
|
4
5
|
[k in keyof TProperties as TProperties[k] extends {
|
|
5
6
|
type: infer R;
|
|
6
7
|
value: infer V;
|
|
7
|
-
} ? V extends InferDetailedType<R
|
|
8
|
+
} ? NonReadonly<V> extends NonReadonly<InferDetailedType<R>> ? never : k : never]: {
|
|
8
9
|
value: () => "⚠️类型错误⚠️";
|
|
9
10
|
};
|
|
10
11
|
}> = EmptyObject extends Result ? unknown : Result;
|
package/package.json
CHANGED
|
@@ -42,6 +42,7 @@ export type FinalOptionsOfComponent = {
|
|
|
42
42
|
__computedInitCache__?: () => ComputedCache;
|
|
43
43
|
};
|
|
44
44
|
externalClasses: string[];
|
|
45
|
+
pageLifetimes: PageLifetimesOption<false, object>["pageLifetimes"] & {};
|
|
45
46
|
isPage?: boolean;
|
|
46
47
|
options?: WMComponent.Options;
|
|
47
48
|
properties?: PropertiesConstraint;
|
|
@@ -49,13 +50,11 @@ export type FinalOptionsOfComponent = {
|
|
|
49
50
|
computed?: ComputedConstraint;
|
|
50
51
|
watch?: Record<string, Func>;
|
|
51
52
|
lifetimes?: LifetimesConstraint;
|
|
52
|
-
pageLifetimes?: PageLifetimesOption<false, object>["pageLifetimes"];
|
|
53
53
|
};
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* 劫持attached,根据this.route做判断 isPage值是否正确
|
|
57
57
|
*/
|
|
58
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试页面 */
|
|
59
58
|
export function isPageCheck(isPage: boolean | undefined) {
|
|
60
59
|
return function(this: Instance) {
|
|
61
60
|
const route = (this as PageInstance).route as string | undefined;
|
|
@@ -81,7 +80,7 @@ export function isPageCheck(isPage: boolean | undefined) {
|
|
|
81
80
|
* 1. 使用wx.navigateTo传值的。这种情况无内置字段 option[INNERMARKER.url] 等于 undefined
|
|
82
81
|
* 2. 使用插件提供的navigateTo传值。这种情况 INNERMARKER.url被load周期劫持函数解码后赋值INNERMARKER.url字段为本身,即option[INNERMARKER.url] 等于 INNERMARKER.url
|
|
83
82
|
*/
|
|
84
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1)
|
|
83
|
+
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试页面生命周期 */
|
|
85
84
|
function onLoadReceivedDataHandle(
|
|
86
85
|
this: PageInstance,
|
|
87
86
|
option: Record<typeof INNERMARKER.url, string>,
|
|
@@ -107,7 +106,7 @@ function onLoadReceivedDataHandle(
|
|
|
107
106
|
* 针对通过 navigateTo传过来的数据对组件load周期传入数据解析
|
|
108
107
|
* @param option - option中的url是拼接了encodeURIComponent转码的data对象的,key为INNERMARKER.url
|
|
109
108
|
*/
|
|
110
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1)
|
|
109
|
+
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试load */
|
|
111
110
|
function loadReceivedDataHandle(
|
|
112
111
|
this: PageInstance,
|
|
113
112
|
option: Record<typeof INNERMARKER.url, string>,
|
|
@@ -127,8 +126,12 @@ function loadReceivedDataHandle(
|
|
|
127
126
|
/**
|
|
128
127
|
* 劫持指定配置字段
|
|
129
128
|
*/
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
function hijack<T extends FinalOptionsOfComponent[keyof FinalOptionsOfComponent]>(
|
|
130
|
+
config: T,
|
|
131
|
+
field: keyof T,
|
|
132
|
+
before: Func[],
|
|
133
|
+
// after: Func[] = [],
|
|
134
|
+
) {
|
|
132
135
|
// @ts-ignore 隐式索引
|
|
133
136
|
const originalFunc: Func | undefined = config[field];
|
|
134
137
|
|
|
@@ -138,7 +141,7 @@ function hijack(config: object, field: string, before: Func[] = [], after: Func[
|
|
|
138
141
|
|
|
139
142
|
originalFunc && originalFunc.apply(this, args);
|
|
140
143
|
|
|
141
|
-
after.forEach(func => func.call(this, ...args));
|
|
144
|
+
// after.forEach(func => func.call(this, ...args));
|
|
142
145
|
};
|
|
143
146
|
|
|
144
147
|
return;
|
|
@@ -147,9 +150,7 @@ function hijack(config: object, field: string, before: Func[] = [], after: Func[
|
|
|
147
150
|
/**
|
|
148
151
|
* 报错的形式避免输入字段和内部字段冲突,保证config下不包含内部预定字段(列表)
|
|
149
152
|
*/
|
|
150
|
-
|
|
151
|
-
function InternalFieldProtection(config: object | undefined, keys: string[]) {
|
|
152
|
-
if (!config) return;
|
|
153
|
+
function InternalFieldProtection(config: object, keys: string[]) {
|
|
153
154
|
const methodsConfigKeys = Object.keys(config);
|
|
154
155
|
for (const key of keys) {
|
|
155
156
|
if (methodsConfigKeys.includes(key)) {
|
|
@@ -176,7 +177,6 @@ function funcOptionsHandle(
|
|
|
176
177
|
isPage: boolean | undefined,
|
|
177
178
|
funcOptions: FuncOptions,
|
|
178
179
|
) {
|
|
179
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试页面 */
|
|
180
180
|
if (isPage) {
|
|
181
181
|
// 页面时 生命周期方法(即 on 开头的方法),(https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/component.html)
|
|
182
182
|
!(isEmptyObject(funcOptions.pageLifetimes))
|
|
@@ -184,7 +184,7 @@ function funcOptionsHandle(
|
|
|
184
184
|
} else {
|
|
185
185
|
// 组件时
|
|
186
186
|
!(isEmptyObject(funcOptions.pageLifetimes))
|
|
187
|
-
&& _funcOptionsHandle(finalOptionsForComponent.pageLifetimes
|
|
187
|
+
&& _funcOptionsHandle(finalOptionsForComponent.pageLifetimes, funcOptions.pageLifetimes);
|
|
188
188
|
}
|
|
189
189
|
funcOptions.lifetimes && _funcOptionsHandle(finalOptionsForComponent.lifetimes ||= {}, funcOptions.lifetimes);
|
|
190
190
|
|
|
@@ -352,12 +352,13 @@ export function collectOptionsForComponent(
|
|
|
352
352
|
const rootComponentOption = defineComponentOption.rootComponent;
|
|
353
353
|
const subComponentsList = defineComponentOption.subComponents;
|
|
354
354
|
|
|
355
|
-
const finalOptionsForComponent: FinalOptionsOfComponent = merge(instanceConfig.injectInfo
|
|
355
|
+
const finalOptionsForComponent: FinalOptionsOfComponent = merge({ ...instanceConfig.injectInfo }, {
|
|
356
356
|
observers: {},
|
|
357
357
|
data: {},
|
|
358
358
|
methods: {},
|
|
359
359
|
behaviors: [BStore, BComputedAndWatch],
|
|
360
360
|
externalClasses: [],
|
|
361
|
+
pageLifetimes: {},
|
|
361
362
|
});
|
|
362
363
|
|
|
363
364
|
/**
|
|
@@ -376,33 +377,28 @@ export function collectOptionsForComponent(
|
|
|
376
377
|
if (subComponentsList && !isEmptyObject(subComponentsList)) {
|
|
377
378
|
subComponentsHandle(finalOptionsForComponent, subComponentsList, funcOptions);
|
|
378
379
|
}
|
|
379
|
-
|
|
380
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试页面 */
|
|
380
|
+
|
|
381
381
|
funcOptionsHandle(finalOptionsForComponent, rootComponentOption?.isPage, funcOptions);
|
|
382
382
|
|
|
383
383
|
InternalFieldProtection(finalOptionsForComponent.methods, ["disposer"]);
|
|
384
384
|
|
|
385
385
|
// 对页面传入参数进行处理 老框架劫持页面methods.onLoad,新框架劫持页面pageLifetimes.load
|
|
386
|
-
|
|
386
|
+
|
|
387
387
|
finalOptionsForComponent.isPage
|
|
388
|
-
&& hijack(finalOptionsForComponent.pageLifetimes
|
|
388
|
+
&& hijack(finalOptionsForComponent.pageLifetimes, "load", [loadReceivedDataHandle]);
|
|
389
389
|
|
|
390
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试页面 */
|
|
391
390
|
hijack(
|
|
392
391
|
finalOptionsForComponent.methods,
|
|
393
392
|
"onLoad",
|
|
394
393
|
[onLoadReceivedDataHandle],
|
|
395
|
-
[],
|
|
396
394
|
);
|
|
397
395
|
|
|
398
396
|
hijack(
|
|
399
397
|
finalOptionsForComponent.lifetimes!,
|
|
400
398
|
"attached",
|
|
401
399
|
[isPageCheck(rootComponentOption?.isPage)],
|
|
402
|
-
[],
|
|
403
400
|
);
|
|
404
401
|
|
|
405
|
-
/* istanbul ignore next: miniprogram-simulate(当前版本 1.6.1) 无法测试页面 */
|
|
406
402
|
finalOptionsForComponent.isPage
|
|
407
403
|
// 页面时删除预设的虚拟组件字段
|
|
408
404
|
&& finalOptionsForComponent.options && Reflect.deleteProperty(finalOptionsForComponent.options, "virtualHost");
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EmptyObject } from "hry-types/src/Misc/EmptyObject";
|
|
2
|
+
import type { NonReadonly } from "hry-types/src/Object/NonReadonly";
|
|
2
3
|
import type { InferDetailedType } from "../../../types/InferDetailedType";
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -12,7 +13,7 @@ export type PropertiesValueValidator<
|
|
|
12
13
|
k in keyof TProperties as TProperties[k] extends {
|
|
13
14
|
type: infer R;
|
|
14
15
|
value: infer V;
|
|
15
|
-
} ? V extends InferDetailedType<R
|
|
16
|
+
} ? NonReadonly<V> extends NonReadonly<InferDetailedType<R>> ? never
|
|
16
17
|
: k
|
|
17
18
|
: never
|
|
18
19
|
]: { value: () => "⚠️类型错误⚠️" };
|
|
@@ -20,7 +20,7 @@ const OptionalDoc = RootComponent()({
|
|
|
20
20
|
},
|
|
21
21
|
optional_tuple: {
|
|
22
22
|
type: Array as unknown as DetailedType<[number, string, boolean]>, // 元组类型
|
|
23
|
-
value: [1, "a", true]
|
|
23
|
+
value: [1, "a", true],
|
|
24
24
|
},
|
|
25
25
|
optional_obj: {
|
|
26
26
|
type: Object as DetailedType<Mock_User>, // 对象类型
|
|
@@ -38,6 +38,10 @@ const OptionalDoc = RootComponent()({
|
|
|
38
38
|
value: "string",
|
|
39
39
|
optionalTypes: [Number],
|
|
40
40
|
},
|
|
41
|
+
optional_arr: {
|
|
42
|
+
type: Array as DetailedType<string[]>,
|
|
43
|
+
value: [],
|
|
44
|
+
},
|
|
41
45
|
},
|
|
42
46
|
methods: {
|
|
43
47
|
foo() {
|
|
@@ -52,6 +56,7 @@ const OptionalDoc = RootComponent()({
|
|
|
52
56
|
optional_obj: Mock_User | null;
|
|
53
57
|
optional_objOrNull: Mock_User | null;
|
|
54
58
|
optional_union: string | number;
|
|
59
|
+
optional_arr: string[];
|
|
55
60
|
} & IInjectData
|
|
56
61
|
>,
|
|
57
62
|
Test.Pass
|
|
@@ -69,6 +74,7 @@ type OptionalDocExpected = {
|
|
|
69
74
|
optional_obj?: Mock_User | null;
|
|
70
75
|
optional_objOrNull?: Mock_User | null;
|
|
71
76
|
optional_union?: string | number;
|
|
77
|
+
optional_arr?: string[];
|
|
72
78
|
};
|
|
73
79
|
methods: {
|
|
74
80
|
foo(): void;
|