miniprogram-api-typings
Advanced tools
Comparing version 3.12.3 to 4.0.0
@@ -0,1 +1,11 @@ | ||
## 2024-09-24 v4.0.0 | ||
合入 [#332](https://github.com/wechat-miniprogram/api-typings/pull/332), [#333](https://github.com/wechat-miniprogram/api-typings/pull/333), [#334](https://github.com/wechat-miniprogram/api-typings/pull/334) by [@lvzl](https://github.com/lv-z-l)。这几个 Pull Request 对 `Component` 和 `Behavior` 的实现进行了较大改动,以支持: | ||
1. 对于 `Array` 和 `Object` 类型的 `property` 和 `data`,以值的实际类型作为泛型推导的结果,而非固定推导为 `any[]` 和 `Record<string, any>`; | ||
2. 改变了 `BehaviorIdentifier` 的类型,通过为其交叉一个带有 `Behavior` 定义信息的虚假类型,使 `Component` 和 `Behavior` 能自动推导其使用到的 `Behavior` 的 `data`, `properties` 及 `methods`; | ||
这是一个比较大的 **破坏性改动**,从低于 4.0.0 的版本升级时,可能需要进行一些适配: | ||
1. 全局函数 `Component` 和 `Behavior` 的第四个泛型现在是新的 `TBehavior`,如果之前的代码中有为这两个函数手动指定泛型的用例,需要手动添加这个泛型; | ||
2. `Behavior()` 的返回值不再是 `string`(或者说不完全是),之前使用 `string` 接受 `Behavior()` 返回值的实现需要修改为 `WechatMiniprogram.Behavior.BehaviorIdentifier`; | ||
3. 自定义组件的 `this.data` 和 `this.property` 的推导类型可能会有所变化,需要根据推导类型进行响应改动。 | ||
## 2024-08-08 v3.12.3 | ||
@@ -2,0 +12,0 @@ - 更新 API 定义到 3.5.2 |
{ | ||
"name": "miniprogram-api-typings", | ||
"version": "3.12.3", | ||
"version": "4.0.0", | ||
"description": "Type definitions for APIs of Wechat Mini Program in TypeScript", | ||
@@ -5,0 +5,0 @@ "main": "./index.d.ts", |
@@ -61,2 +61,3 @@ # Wechat Mini Program API Typings | ||
- [Yang Mingshan](https://github.com/yangmingshan) | ||
- [lvzl](https://github.com/lv-z-l) | ||
@@ -63,0 +64,0 @@ ### Automated tests |
@@ -61,2 +61,3 @@ # 微信小程序定义文件 | ||
- [Yang Mingshan](https://github.com/yangmingshan) | ||
- [lvzl](https://github.com/lv-z-l) | ||
@@ -63,0 +64,0 @@ ### 测试 |
@@ -24,3 +24,15 @@ /*! ***************************************************************************** | ||
declare namespace WechatMiniprogram.Behavior { | ||
type BehaviorIdentifier = string | ||
type BehaviorIdentifier< | ||
TData extends DataOption = {}, | ||
TProperty extends PropertyOption = {}, | ||
TMethod extends MethodOption = {}, | ||
TBehavior extends BehaviorOption = [] | ||
> = string & { | ||
[key in 'BehaviorType']?: { | ||
data: Component.FilterUnknownType<TData> & Component.MixinData<TBehavior> | ||
properties: Component.FilterUnknownType<TProperty> & Component.MixinProperties<TBehavior, true> | ||
methods: Component.FilterUnknownType<TMethod> & Component.MixinMethods<TBehavior> | ||
} | ||
} | ||
type Instance< | ||
@@ -30,6 +42,7 @@ TData extends DataOption, | ||
TMethod extends MethodOption, | ||
TBehavior extends BehaviorOption, | ||
TCustomInstanceProperty extends IAnyObject = Record<string, never> | ||
> = Component.Instance<TData, TProperty, TMethod, TCustomInstanceProperty> | ||
type TrivialInstance = Instance<IAnyObject, IAnyObject, IAnyObject> | ||
type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject> | ||
> = Component.Instance<TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty> | ||
type TrivialInstance = Instance<IAnyObject, IAnyObject, IAnyObject, Component.IEmptyArray> | ||
type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject, Component.IEmptyArray> | ||
type Options< | ||
@@ -39,2 +52,3 @@ TData extends DataOption, | ||
TMethod extends MethodOption, | ||
TBehavior extends BehaviorOption, | ||
TCustomInstanceProperty extends IAnyObject = Record<string, never> | ||
@@ -44,5 +58,6 @@ > = Partial<Data<TData>> & | ||
Partial<Method<TMethod>> & | ||
Partial<Behavior<TBehavior>> & | ||
Partial<OtherOption> & | ||
Partial<Lifetimes> & | ||
ThisType<Instance<TData, TProperty, TMethod, TCustomInstanceProperty>> | ||
ThisType<Instance<TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty>> | ||
interface Constructor { | ||
@@ -53,6 +68,7 @@ < | ||
TMethod extends MethodOption, | ||
TBehavior extends BehaviorOption, | ||
TCustomInstanceProperty extends IAnyObject = Record<string, never> | ||
>( | ||
options: Options<TData, TProperty, TMethod, TCustomInstanceProperty> | ||
): BehaviorIdentifier | ||
options: Options<TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty> | ||
): BehaviorIdentifier<TData, TProperty, TMethod, TBehavior> | ||
} | ||
@@ -63,9 +79,10 @@ | ||
type MethodOption = Component.MethodOption | ||
type BehaviorOption = Component.BehaviorOption | ||
type Data<D extends DataOption> = Component.Data<D> | ||
type Property<P extends PropertyOption> = Component.Property<P> | ||
type Method<M extends MethodOption> = Component.Method<M> | ||
type Behavior<B extends BehaviorOption> = Component.Behavior<B> | ||
type DefinitionFilter = Component.DefinitionFilter | ||
type Lifetimes = Component.Lifetimes | ||
type OtherOption = Omit<Component.OtherOption, 'options'> | ||
@@ -72,0 +89,0 @@ } |
@@ -24,2 +24,3 @@ /*! ***************************************************************************** | ||
declare namespace WechatMiniprogram.Component { | ||
type FilterUnknownType<T> = string extends keyof T ? {} : T | ||
type Instance< | ||
@@ -29,2 +30,3 @@ TData extends DataOption, | ||
TMethod extends Partial<MethodOption>, | ||
TBehavior extends BehaviorOption, | ||
TCustomInstanceProperty extends IAnyObject = {}, | ||
@@ -35,9 +37,14 @@ TIsPage extends boolean = false | ||
TMethod & | ||
MixinMethods<TBehavior> & | ||
(TIsPage extends true ? Page.ILifetime : {}) & | ||
TCustomInstanceProperty & { | ||
Omit<TCustomInstanceProperty, 'properties' | 'methods' | 'data'> & { | ||
/** 组件数据,**包括内部数据和属性值** */ | ||
data: TData & PropertyOptionToData<TProperty> | ||
data: FilterUnknownType<TData> & MixinData<TBehavior> & | ||
MixinProperties<TBehavior> & PropertyOptionToData<FilterUnknownType<TProperty>> | ||
/** 组件数据,**包括内部数据和属性值**(与 `data` 一致) */ | ||
properties: TData & PropertyOptionToData<TProperty> | ||
properties: FilterUnknownType<TData> & MixinData<TBehavior> & | ||
MixinProperties<TBehavior> & PropertyOptionToData<FilterUnknownType<TProperty>> | ||
} | ||
type IEmptyArray = [] | ||
type TrivialInstance = Instance< | ||
@@ -47,5 +54,6 @@ IAnyObject, | ||
IAnyObject, | ||
IEmptyArray, | ||
IAnyObject | ||
> | ||
type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject, IAnyObject> | ||
type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject, IEmptyArray, IAnyObject> | ||
type Options< | ||
@@ -55,2 +63,3 @@ TData extends DataOption, | ||
TMethod extends MethodOption, | ||
TBehavior extends BehaviorOption, | ||
TCustomInstanceProperty extends IAnyObject = {}, | ||
@@ -61,2 +70,3 @@ TIsPage extends boolean = false | ||
Partial<Method<TMethod, TIsPage>> & | ||
Partial<Behavior<TBehavior>> & | ||
Partial<OtherOption> & | ||
@@ -69,2 +79,3 @@ Partial<Lifetimes> & | ||
TMethod, | ||
TBehavior, | ||
TCustomInstanceProperty, | ||
@@ -79,2 +90,3 @@ TIsPage | ||
TMethod extends MethodOption, | ||
TBehavior extends BehaviorOption, | ||
TCustomInstanceProperty extends IAnyObject = {}, | ||
@@ -87,2 +99,3 @@ TIsPage extends boolean = false | ||
TMethod, | ||
TBehavior, | ||
TCustomInstanceProperty, | ||
@@ -97,2 +110,18 @@ TIsPage | ||
type BehaviorOption = Behavior.BehaviorIdentifier[] | ||
type ExtractBehaviorType<T> = T extends { BehaviorType?: infer B } ? B : never | ||
type ExtractData<T> = T extends { data: infer D } ? D : never | ||
type ExtractProperties<T, TIsBehavior extends boolean = false> = T extends { properties: infer P } ? | ||
TIsBehavior extends true ? P : PropertyOptionToData<P extends PropertyOption ? P : {}> : never | ||
type ExtractMethods<T> = T extends { methods: infer M } ? M : never | ||
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never | ||
type MixinData<T extends any[]> = UnionToIntersection<ExtractData<ExtractBehaviorType<T[number]>>> | ||
type MixinProperties<T extends any[], TIsBehavior extends boolean = false> = UnionToIntersection<ExtractProperties<ExtractBehaviorType<T[number]>, TIsBehavior>> | ||
type MixinMethods<T extends any[]> = UnionToIntersection<ExtractMethods<ExtractBehaviorType<T[number]>>> | ||
interface Behavior<B extends BehaviorOption> { | ||
/** 类似于mixins和traits的组件间代码复用机制,参见 [behaviors](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html) */ | ||
behaviors?: B | ||
} | ||
interface Data<D extends DataOption> { | ||
@@ -164,4 +193,4 @@ /** 组件的内部数据,和 `properties` 一同用于组件的模板渲染 */ | ||
: FullPropertyToData<Exclude<T, ShortProperty>> | ||
type FullPropertyToData<T extends AllFullProperty> = ValueType<T['type']> | ||
// type FullPropertyToData<T extends AllFullProperty> = unknown extends T['value'] ? ValueType<T['type']> : T['value'] | ||
type ArrayOrObject = ArrayConstructor | ObjectConstructor | ||
type FullPropertyToData<T extends AllFullProperty> = T['type'] extends ArrayOrObject ? unknown extends T['value'] ? ValueType<T['type']> : T['value'] : ValueType<T['type']> | ||
type PropertyOptionToData<P extends PropertyOption> = { | ||
@@ -537,4 +566,2 @@ [name in keyof P]: PropertyToData<P[name]> | ||
interface OtherOption { | ||
/** 类似于mixins和traits的组件间代码复用机制,参见 [behaviors](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html) */ | ||
behaviors: Behavior.BehaviorIdentifier[] | ||
/** | ||
@@ -541,0 +568,0 @@ * 组件数据字段监听器,用于监听 properties 和 data 的变化,参见 [数据监听器](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/observer.html) |
2289700
56242
70