Skip to content

Commit c54c382

Browse files
committed
feat: supports the issues/331 mentioned in points 2, 3, 4
1 parent 6a7f4f9 commit c54c382

File tree

3 files changed

+16
-20
lines changed

3 files changed

+16
-20
lines changed

test/component.test.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Component({
2929
max: {
3030
type: Number,
3131
value: 0,
32-
observer(newVal, oldVal) {
32+
observer(newVal: number, oldVal: number) {
3333
expectType<number>(newVal)
3434
expectType<number>(oldVal)
3535
expectType<void>(this.onMyButtonTap())
@@ -120,17 +120,6 @@ Component({
120120
},
121121
})
122122

123-
expectError(
124-
Component({
125-
custom: 1,
126-
methods: {
127-
f() {
128-
this.custom
129-
},
130-
},
131-
}),
132-
)
133-
134123
interface Config {
135124
a: number
136125
}
@@ -178,7 +167,7 @@ Component({
178167
expectType<number>(this.data.n2)
179168
expectType<string>(this.data.s)
180169
expectType<any[]>(this.data.a)
181-
expectType<any[]>(this.data.a2)
170+
expectType<number[]>(this.data.a2)
182171
expectType<boolean>(this.data.b)
183172
expectType<Record<string, any>>(this.data.o)
184173
expectType<any>(this.data.a[0])
@@ -218,7 +207,7 @@ Component({
218207
expectType<number>(this.data.n2)
219208
expectType<string>(this.data.s)
220209
expectType<any[]>(this.data.a)
221-
expectType<any[]>(this.data.a2)
210+
expectType<number[]>(this.data.a2)
222211
expectType<boolean>(this.data.b)
223212
expectType<Record<string, any>>(this.data.o)
224213
expectType<Record<string, any>>(this.data.o2)
@@ -243,7 +232,7 @@ Component({
243232
methods: {
244233
f() {
245234
expectType<number>(this.data.n)
246-
expectType<any[]>(this.data.a)
235+
expectType<number[]>(this.data.a)
247236
},
248237
},
249238
})

test/issue.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,9 @@ import WX = WechatMiniprogram
397397
return this.data.foo
398398
},
399399
test() {
400-
expectType<Record<string, any>>(this.data.bar)
400+
expectType<{
401+
skuNum: number
402+
}>(this.data.bar)
401403
expectType<number>(this.getDataOrPoperty())
402404
},
403405
}

types/wx/lib.wx.component.d.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ declare namespace WechatMiniprogram.Component {
5555
Partial<Method<TMethod, TIsPage>> &
5656
Partial<OtherOption> &
5757
Partial<Lifetimes> &
58+
// 有很大几率会在 this.xxx 上使用一些暂存的变量,应该像Page一样支持传入自定义属性
59+
Partial<TCustomInstanceProperty> &
5860
ThisType<
5961
Instance<
6062
TData,
@@ -67,8 +69,10 @@ declare namespace WechatMiniprogram.Component {
6769
interface Constructor {
6870
<
6971
TData extends DataOption,
70-
TProperty extends PropertyOption,
71-
TMethod extends MethodOption,
72+
// 给泛型默认值,避免出现当组件无 properties 选项时
73+
// 当xxx未在 data 中声明,this.data.xxx 为 any 的问题。
74+
TProperty extends PropertyOption = {},
75+
TMethod extends MethodOption = {},
7276
TCustomInstanceProperty extends IAnyObject = {},
7377
TIsPage extends boolean = false
7478
>(
@@ -151,8 +155,9 @@ declare namespace WechatMiniprogram.Component {
151155
type PropertyToData<T extends AllProperty> = T extends ShortProperty
152156
? ValueType<T>
153157
: FullPropertyToData<Exclude<T, ShortProperty>>
154-
type FullPropertyToData<T extends AllFullProperty> = ValueType<T['type']>
155-
// type FullPropertyToData<T extends AllFullProperty> = unknown extends T['value'] ? ValueType<T['type']> : T['value']
158+
type ArrayOrObject = ArrayConstructor | ObjectConstructor
159+
// 支持 Array、Object 的 property 通过 value as ValueType 的方式明确 property 的类型
160+
type FullPropertyToData<T extends AllFullProperty> = T['type'] extends ArrayOrObject ? unknown extends T['value'] ? ValueType<T['type']> : T['value'] : ValueType<T['type']>
156161
type PropertyOptionToData<P extends PropertyOption> = {
157162
[name in keyof P]: PropertyToData<P[name]>
158163
}

0 commit comments

Comments
 (0)