Skip to content

Commit 0a76c78

Browse files
authored
Merge pull request #332 from lv-z-l/master
feat: supports the issues/331 mentioned in points 2, 3, 4
2 parents 6a7f4f9 + 7002da6 commit 0a76c78

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

test/component.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ Component({
178178
expectType<number>(this.data.n2)
179179
expectType<string>(this.data.s)
180180
expectType<any[]>(this.data.a)
181-
expectType<any[]>(this.data.a2)
181+
expectType<number[]>(this.data.a2)
182182
expectType<boolean>(this.data.b)
183183
expectType<Record<string, any>>(this.data.o)
184184
expectType<any>(this.data.a[0])
@@ -218,7 +218,7 @@ Component({
218218
expectType<number>(this.data.n2)
219219
expectType<string>(this.data.s)
220220
expectType<any[]>(this.data.a)
221-
expectType<any[]>(this.data.a2)
221+
expectType<number[]>(this.data.a2)
222222
expectType<boolean>(this.data.b)
223223
expectType<Record<string, any>>(this.data.o)
224224
expectType<Record<string, any>>(this.data.o2)
@@ -243,7 +243,7 @@ Component({
243243
methods: {
244244
f() {
245245
expectType<number>(this.data.n)
246-
expectType<any[]>(this.data.a)
246+
expectType<number[]>(this.data.a)
247247
},
248248
},
249249
})

test/issue.test.ts

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expectType } from 'tsd'
1+
import { expectError, expectType } from 'tsd'
22

33
// https://github.com/wechat-miniprogram/api-typings/issues/11
44
expectType<string>(wx.env.USER_DATA_PATH)
@@ -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
}
@@ -441,3 +443,46 @@ import WX = WechatMiniprogram
441443
expectType<number>(offscreenCanvas.height)
442444
expectType<number>(offscreenCanvas.width)
443445
}
446+
447+
// https://github.com/wechat-miniprogram/api-typings/issues/332
448+
{
449+
Component({
450+
data: {
451+
a: ''
452+
},
453+
methods: {
454+
test() {
455+
expectError<any>(this.data.xxx)
456+
},
457+
}
458+
})
459+
}
460+
461+
{
462+
interface Foo {
463+
f: string
464+
}
465+
466+
Component({
467+
properties: {
468+
bar: {
469+
type: Object,
470+
value: { f: '' } as Foo,
471+
observer () {}
472+
},
473+
foo: {
474+
type: Array,
475+
value: [] as Foo[],
476+
}
477+
},
478+
methods: {
479+
getData() {
480+
return this.data.foo
481+
},
482+
test() {
483+
expectType<Foo>(this.data.bar)
484+
expectType<Foo[]>(this.getData())
485+
},
486+
}
487+
})
488+
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ SOFTWARE.
2121
***************************************************************************** */
2222

2323
declare namespace WechatMiniprogram.Component {
24+
type FilterUnknownProperty<TProperty> = string extends keyof TProperty ? {} : TProperty
2425
type Instance<
2526
TData extends DataOption,
2627
TProperty extends PropertyOption,
@@ -33,9 +34,9 @@ declare namespace WechatMiniprogram.Component {
3334
(TIsPage extends true ? Page.ILifetime : {}) &
3435
TCustomInstanceProperty & {
3536
/** 组件数据,**包括内部数据和属性值** */
36-
data: TData & PropertyOptionToData<TProperty>
37+
data: TData & PropertyOptionToData<FilterUnknownProperty<TProperty>>
3738
/** 组件数据,**包括内部数据和属性值**(与 `data` 一致) */
38-
properties: TData & PropertyOptionToData<TProperty>
39+
properties: TData & PropertyOptionToData<FilterUnknownProperty<TProperty>>
3940
}
4041
type TrivialInstance = Instance<
4142
IAnyObject,
@@ -151,8 +152,8 @@ declare namespace WechatMiniprogram.Component {
151152
type PropertyToData<T extends AllProperty> = T extends ShortProperty
152153
? ValueType<T>
153154
: 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']
155+
type ArrayOrObject = ArrayConstructor | ObjectConstructor
156+
type FullPropertyToData<T extends AllFullProperty> = T['type'] extends ArrayOrObject ? unknown extends T['value'] ? ValueType<T['type']> : T['value'] : ValueType<T['type']>
156157
type PropertyOptionToData<P extends PropertyOption> = {
157158
[name in keyof P]: PropertyToData<P[name]>
158159
}

0 commit comments

Comments
 (0)