;
+declare type PropertyOptionToData = {
+ [name in keyof P]: PropertyToData
;
+};
+interface ComponentOption, FrontCxt extends SyncContext, AD extends Record>, FD extends Record, FormedData extends Record, IsList extends boolean, TData extends DataOption, TProperty extends PropertyOption> {
+ entity?: T | ((this: ComponentPublicThisType) => T);
path?: string;
isList: IsList;
- projection?: ED[T]['Selection']['data'] | ((options: {
- features: BasicFeatures> & FD;
- props: Partial>;
- state: Record;
- }) => ED[T]['Selection']['data']);
+ projection?: ED[T]['Selection']['data'] | ((this: ComponentPublicThisType) => ED[T]['Selection']['data']);
append?: boolean;
pagination?: Pagination;
filters?: Array<{
- filter: ED[T]['Selection']['filter'] | ((options: {
- features: BasicFeatures> & FD;
- props: Partial>;
- state: Record;
- }) => ED[T]['Selection']['filter'] | undefined);
+ filter: ED[T]['Selection']['filter'] | ((this: ComponentPublicThisType) => ED[T]['Selection']['filter'] | undefined);
'#name'?: string;
}>;
sorters?: Array<{
- sorter: NonNullable[number] | ((options: {
- features: BasicFeatures> & FD;
- props: Partial>;
- state: Record;
- }) => NonNullable[number]);
+ sorter: NonNullable[number] | ((this: ComponentPublicThisType) => NonNullable[number]);
'#name'?: string;
}>;
formData?: (options: {
data: IsList extends true ? Partial[] : Partial | undefined;
features: BasicFeatures> & FD;
- props: Partial>;
+ props: Partial>;
legalActions: ED[T]['Action'][];
- }) => FormedData;
+ }) => FormedData & ThisType>;
ns?: T | T[];
+ data?: ((this: ComponentPublicThisType) => TData) | TData;
+ properties?: TProperty;
}
export declare type MiniprogramStyleMethods = {
animate(selector: string, keyFrames: WechatMiniprogram.Component.KeyFrame[], duration: number, callback?: () => void): void;
clearAnimation(selector: string, options?: WechatMiniprogram.Component.ClearAnimationOptions, callback?: () => void): void;
triggerEvent: (name: string, detail?: DetailType, options?: WechatMiniprogram.Component.TriggerEventOption) => void;
};
-export declare type ComponentProps = IsList extends true ? WechatMiniprogram.Component.PropertyOptionToData : WechatMiniprogram.Component.PropertyOptionToData;
-export declare type ComponentData = TData & FormedData & OakComponentData;
-export declare type ComponentPublicThisType, FrontCxt extends SyncContext, AD extends Record>, FD extends Record, FormedData extends Record, IsList extends boolean, TData extends Record = {}, TProperty extends WechatMiniprogram.Component.PropertyOption = {}, TMethod extends WechatMiniprogram.Component.MethodOption = {}> = {
+export declare type ComponentProps = IsList extends true ? PropertyOptionToData : PropertyOptionToData;
+export declare type ComponentData = TData & FormedData & OakComponentData;
+export declare type ComponentPublicThisType, FrontCxt extends SyncContext, AD extends Record>, FD extends Record, FormedData extends Record, IsList extends boolean, TData extends Record = {}, TProperty extends PropertyOption = {}, TMethod extends MethodOption = {}> = {
subscribed: Array<() => void>;
features: FD & BasicFeatures>;
state: ComponentData;
@@ -69,12 +86,7 @@ export declare type ComponentFullThisType>, callback?: () => void) => void;
triggerEvent: (name: string, detail?: DetailType, options?: WechatMiniprogram.Component.TriggerEventOption) => void;
} & OakCommonComponentMethods & OakListComponentMethods & OakSingleComponentMethods;
-export declare type OakComponentOption, FrontCxt extends SyncContext, AD extends Record>, FD extends Record, FormedData extends Record, IsList extends boolean, TData extends Record, TProperty extends WechatMiniprogram.Component.PropertyOption, TMethod extends Record> = ComponentOption & Partial<{
- data?: ((option: {
- features: BasicFeatures> & FD;
- props: ComponentProps;
- }) => TData) | TData;
- properties: Record;
+export declare type OakComponentOption, FrontCxt extends SyncContext, AD extends Record>, FD extends Record, FormedData extends Record, IsList extends boolean, TData extends Record, TProperty extends PropertyOption, TMethod extends Record> = ComponentOption & Partial<{
methods: TMethod;
lifetimes: {
created?(): void;
@@ -86,7 +98,7 @@ export declare type OakComponentOption) => ED[T]['Action'][]);
+ actions: ED[T]['Action'][] | ((this: ComponentPublicThisType) => ED[T]['Action'][]);
observers: Record any>;
}> & Partial<{
wechatMp: {
@@ -218,11 +230,11 @@ export declare type OakListComoponetData[];
oakPagination?: Pagination;
};
-export declare type MakeOakComponent, FrontCxt extends SyncContext, AD extends Record>, FD extends Record> = (options: OakComponentOption) => React.ComponentType;
+export declare type MakeOakComponent, FrontCxt extends SyncContext, AD extends Record>, FD extends Record> = (options: OakComponentOption) => React.ComponentType;
export declare type WebComponentCommonMethodNames = 'setNotification' | 'setMessage' | 'navigateTo' | 'navigateBack' | 'redirectTo' | 'clean' | 't' | 'execute' | 'refresh' | 'setDisablePulldownRefresh' | 'aggregate';
export declare type WebComponentListMethodNames = 'loadMore' | 'setFilters' | 'addNamedFilter' | 'removeNamedFilter' | 'removeNamedFilterByName' | 'setNamedSorters' | 'addNamedSorter' | 'removeNamedSorter' | 'removeNamedSorterByName' | 'setPageSize' | 'setCurrentPage' | 'addItem' | 'removeItem' | 'updateItem';
export declare type WebComponentSingleMethodNames = 'update' | 'remove';
-export declare type WebComponentProps = {
+export declare type WebComponentProps = {
methods: TMethod & OakCommonComponentMethods & OakListComponentMethods & OakSingleComponentMethods;
data: TData & OakComponentData & (IsList extends true ? OakListComoponetData : {});
};
diff --git a/src/initialize.dev.mp.ts b/src/initialize.dev.mp.ts
index c95b8bdb..07057e48 100644
--- a/src/initialize.dev.mp.ts
+++ b/src/initialize.dev.mp.ts
@@ -18,7 +18,11 @@ import { Feature } from './types/Feature';
import { BasicFeatures } from './features';
import { ActionDictOfEntityDict } from 'oak-domain/lib/types/Action';
import { CommonAspectDict } from 'oak-common-aspect';
-import { OakComponentOption } from './types/Page';
+import {
+ DataOption,
+ PropertyOption,
+ MethodOption,
+ OakComponentOption } from './types/Page';
import { createComponent } from './page.mp';
import { initialize as initDev } from './initialize-dev';
import { getI18next, I18nOptions } from './platforms/wechatMp/i18n';
@@ -78,11 +82,11 @@ export function initialize<
Object.assign(global, {
OakComponent: <
T extends keyof ED,
- FormedData extends WechatMiniprogram.Component.DataOption,
+ FormedData extends DataOption,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
- TMethod extends WechatMiniprogram.Component.MethodOption = {}
+ TData extends DataOption = {},
+ TProperty extends PropertyOption = {},
+ TMethod extends MethodOption = {}
>(
options: OakComponentOption<
ED,
diff --git a/src/initialize.dev.web.ts b/src/initialize.dev.web.ts
index e5b01441..a6a95f75 100644
--- a/src/initialize.dev.web.ts
+++ b/src/initialize.dev.web.ts
@@ -22,13 +22,17 @@ import { Feature } from './types/Feature';
import { BasicFeatures } from './features';
import { ActionDictOfEntityDict } from 'oak-domain/lib/types/Action';
import { CommonAspectDict } from 'oak-common-aspect';
-import { OakComponentOption } from './types/Page';
import { createComponent } from './page.web';
import { initialize as initDev } from './initialize-dev';
import { getI18next, I18nOptions } from './platforms/web/i18n';
import { AsyncContext, AsyncRowStore } from 'oak-domain/lib/store/AsyncRowStore';
import { SyncContext } from 'oak-domain/lib/store/SyncRowStore';
import { CacheStore } from './cacheStore/CacheStore';
+import {
+ DataOption,
+ PropertyOption,
+ MethodOption,
+ OakComponentOption } from './types/Page';
export function initialize<
ED extends EntityDict & BaseEntityDict,
@@ -83,11 +87,11 @@ export function initialize<
Object.assign(global, {
OakComponent: <
T extends keyof ED,
- FormedData extends WechatMiniprogram.Component.DataOption,
+ FormedData extends DataOption,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
- TMethod extends WechatMiniprogram.Component.MethodOption = {}
+ TData extends DataOption = {},
+ TProperty extends PropertyOption = {},
+ TMethod extends MethodOption = {}
>(
options: OakComponentOption<
ED,
diff --git a/src/initialize.prod.mp.ts b/src/initialize.prod.mp.ts
index 8c03e321..3a85d42b 100644
--- a/src/initialize.prod.mp.ts
+++ b/src/initialize.prod.mp.ts
@@ -18,13 +18,17 @@ import { Feature } from './types/Feature';
import { BasicFeatures } from './features';
import { ActionDictOfEntityDict } from 'oak-domain/lib/types/Action';
import { CommonAspectDict } from 'oak-common-aspect';
-import { OakComponentOption } from './types/Page';
import { createComponent } from './page.mp';
import { initialize as initProd } from './initialize-prod';
import { getI18next, I18nOptions } from './platforms/wechatMp/i18n';
import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
import { SyncContext } from 'oak-domain/lib/store/SyncRowStore';
import { CacheStore } from './cacheStore/CacheStore';
+import {
+ DataOption,
+ PropertyOption,
+ MethodOption,
+ OakComponentOption } from './types/Page';
export function initialize<
ED extends EntityDict & BaseEntityDict,
@@ -60,11 +64,11 @@ export function initialize<
Object.assign(global, {
OakComponent: <
T extends keyof ED,
- FormedData extends WechatMiniprogram.Component.DataOption,
+ FormedData extends DataOption,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
- TMethod extends WechatMiniprogram.Component.MethodOption = {}
+ TData extends DataOption = {},
+ TProperty extends PropertyOption = {},
+ TMethod extends MethodOption = {}
>(
options: OakComponentOption<
ED,
diff --git a/src/initialize.prod.web.ts b/src/initialize.prod.web.ts
index 55018894..f8087c7d 100644
--- a/src/initialize.prod.web.ts
+++ b/src/initialize.prod.web.ts
@@ -18,7 +18,11 @@ import { Feature } from './types/Feature';
import { BasicFeatures } from './features';
import { ActionDictOfEntityDict } from 'oak-domain/lib/types/Action';
import { CommonAspectDict } from 'oak-common-aspect';
-import { OakComponentOption } from './types/Page';
+import {
+ DataOption,
+ PropertyOption,
+ MethodOption,
+ OakComponentOption } from './types/Page';
import { createComponent } from './page.web';
import { initialize as initProd } from './initialize-prod';
import { getI18next, I18nOptions } from './platforms/web/i18n';
@@ -60,11 +64,11 @@ export function initialize<
Object.assign(global, {
OakComponent: <
T extends keyof ED,
- FormedData extends WechatMiniprogram.Component.DataOption,
+ FormedData extends DataOption,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
- TMethod extends WechatMiniprogram.Component.MethodOption = {}
+ TData extends DataOption = {},
+ TProperty extends PropertyOption = {},
+ TMethod extends MethodOption = {}
>(
options: OakComponentOption<
ED,
diff --git a/src/page.common.ts b/src/page.common.ts
index 71d684be..c1c80c01 100644
--- a/src/page.common.ts
+++ b/src/page.common.ts
@@ -43,11 +43,7 @@ export async function onPathSet<
filter:
typeof filter === 'function'
? () =>
- (filter as Function).call(this, {
- features,
- props: this.props,
- state: this.state,
- })
+ (filter as Function).call(this)
: filter,
['#name']: name,
});
@@ -57,11 +53,7 @@ export async function onPathSet<
if (!proj && projection) {
proj = typeof projection === 'function'
? () =>
- (projection as Function).call(this, {
- features,
- props: this.props,
- state: this.state,
- })
+ (projection as Function).call(this)
: projection;
}
let sorters2: NamedSorterItem[] = [];
@@ -76,11 +68,7 @@ export async function onPathSet<
sorter:
typeof sorter === 'function'
? () =>
- (sorter as Function).call(this, {
- features,
- props: this.props,
- state: this.state,
- })
+ (sorter as Function).call(this)
: sorter,
['#name']: name,
});
diff --git a/src/page.mp.ts b/src/page.mp.ts
index 014f3cb9..7563c911 100644
--- a/src/page.mp.ts
+++ b/src/page.mp.ts
@@ -6,6 +6,9 @@ import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
import { BasicFeatures } from './features';
import { Feature } from './types/Feature';
import {
+ DataOption,
+ PropertyOption,
+ MethodOption,
ComponentProps,
OakCommonComponentMethods,
OakComponentOption,
@@ -44,7 +47,7 @@ type ADD = Record>;
type FDD = Record;
type FrontCxt = SyncContext;
const oakBehavior = Behavior<
- WechatMiniprogram.Component.DataOption,
+ DataOption,
WechatMiniprogram.Component.PropertyOption,
OakCommonComponentMethods &
OakListComponentMethods &
@@ -626,7 +629,7 @@ export function createComponent<
FormedData extends Record,
IsList extends boolean,
TData extends Record = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
+ TProperty extends PropertyOption = {},
TMethod extends Record = {}
>(
option: OakComponentOption<
@@ -656,9 +659,9 @@ export function createComponent<
const { options, externalClasses } = wechatMp || {};
return Component<
- WechatMiniprogram.Component.DataOption,
+ DataOption,
WechatMiniprogram.Component.PropertyOption,
- WechatMiniprogram.Component.MethodOption,
+ MethodOption,
{
state: Record;
props: {
@@ -704,7 +707,7 @@ export function createComponent<
}) : {
oakFullpath: '',
},
- properties: Object.assign(
+ properties: Object.assign(
{},
properties,
OakProperties
diff --git a/src/page.web.tsx b/src/page.web.tsx
index a7f00bb7..a5a99051 100644
--- a/src/page.web.tsx
+++ b/src/page.web.tsx
@@ -10,6 +10,9 @@ import { BasicFeatures } from './features';
import { NamedFilterItem, NamedSorterItem } from './types/NamedCondition';
import { Feature } from './types/Feature';
import {
+ DataOption,
+ PropertyOption,
+ MethodOption,
ComponentData,
ComponentProps,
OakComponentOption,
@@ -38,9 +41,9 @@ abstract class OakComponentBase<
FD extends Record,
FormedData extends Record,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption,
- TProperty extends WechatMiniprogram.Component.PropertyOption,
- TMethod extends WechatMiniprogram.Component.MethodOption
+ TData extends DataOption,
+ TProperty extends PropertyOption,
+ TMethod extends MethodOption
> extends React.PureComponent<
ComponentProps,
ComponentData
@@ -617,7 +620,7 @@ export function createComponent<
FormedData extends Record,
IsList extends boolean,
TData extends Record = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
+ TProperty extends PropertyOption = {},
TMethod extends Record = {}
>(
option: OakComponentOption<
diff --git a/src/types/Page.ts b/src/types/Page.ts
index 35c06443..fff717f0 100644
--- a/src/types/Page.ts
+++ b/src/types/Page.ts
@@ -10,6 +10,77 @@ import { MessageProps } from './Message';
import { AsyncContext } from "oak-domain/lib/store/AsyncRowStore";
import { SyncContext } from "oak-domain/lib/store/SyncRowStore";
+export type PropertyOption = Record;
+
+export type DataOption = WechatMiniprogram.Component.DataOption;
+
+export type MethodOption = WechatMiniprogram.Component.MethodOption;
+
+/**
+ * 微信的原声明中少写了FunctionConstructor,只能抄一遍
+ */
+type PropertyType =
+ | FunctionConstructor
+ | StringConstructor
+ | NumberConstructor
+ | BooleanConstructor
+ | ArrayConstructor
+ | ObjectConstructor
+ | null
+type ValueType = T extends null
+ ? any
+ : T extends StringConstructor
+ ? string
+ : T extends NumberConstructor
+ ? number
+ : T extends BooleanConstructor
+ ? boolean
+ : T extends ArrayConstructor
+ ? any[]
+ : T extends ObjectConstructor
+ ? AnyObject
+ : T extends FunctionConstructor
+ ? Function
+ :never
+type FullProperty = {
+ /** 属性类型 */
+ type: T
+ /** 属性初始值 */
+ value?: ValueType | undefined
+ /** 属性值被更改时的响应函数 */
+ observer?:
+ | string
+ | ((
+ newVal: ValueType,
+ oldVal: ValueType,
+ changedPath: Array
+ ) => void) | undefined
+ /** 属性的类型(可以指定多个) */
+ optionalTypes?: ShortProperty[] | undefined
+}
+type AllFullProperty =
+ | FullProperty
+ | FullProperty
+ | FullProperty
+ | FullProperty
+ | FullProperty
+ | FullProperty
+type ShortProperty =
+ | FunctionConstructor
+ | StringConstructor
+ | NumberConstructor
+ | BooleanConstructor
+ | ArrayConstructor
+ | ObjectConstructor
+ | null
+type AllProperty = AllFullProperty | ShortProperty
+type PropertyToData = T extends ShortProperty
+ ? ValueType
+ : FullPropertyToData>
+type FullPropertyToData = ValueType
+type PropertyOptionToData = {
+ [name in keyof P]: PropertyToData
+};
interface ComponentOption<
ED extends EntityDict & BaseEntityDict,
@@ -20,41 +91,32 @@ interface ComponentOption<
FD extends Record,
FormedData extends Record,
IsList extends boolean,
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
+ TData extends DataOption,
+ TProperty extends PropertyOption,
> {
- entity?: T | (() => T);
+ entity?: T | ((this: ComponentPublicThisType) => T);
path?: string;
isList: IsList;
- projection?: ED[T]['Selection']['data'] | ((options: {
- features: BasicFeatures> & FD;
- props: Partial>;
- state: Record;
- }) => ED[T]['Selection']['data']);
+ projection?: ED[T]['Selection']['data'] | ((this: ComponentPublicThisType) => ED[T]['Selection']['data']);
append?: boolean;
pagination?: Pagination;
filters?: Array<{
- filter: ED[T]['Selection']['filter'] | ((options: {
- features: BasicFeatures> & FD;
- props: Partial>;
- state: Record;
- }) => ED[T]['Selection']['filter'] | undefined)
+ filter: ED[T]['Selection']['filter'] | ((this: ComponentPublicThisType) => ED[T]['Selection']['filter'] | undefined);
'#name'?: string;
}>;
sorters?: Array<{
- sorter: NonNullable[number] | ((options: {
- features: BasicFeatures> & FD;
- props: Partial>;
- state: Record;
- }) => NonNullable[number])
+ sorter: NonNullable[number] | ((this: ComponentPublicThisType) => NonNullable[number]);
'#name'?: string;
}>;
formData?: (options: {
data: IsList extends true ? Partial[] : Partial | undefined;
features: BasicFeatures> & FD;
- props: Partial>;
+ props: Partial>;
legalActions: ED[T]['Action'][];
- }) => FormedData;
+ }) => FormedData & ThisType>;
ns?: T | T[];
+ data?: ((this: ComponentPublicThisType) => TData) | TData;
+ properties?: TProperty;
};
export type MiniprogramStyleMethods = {
@@ -76,15 +138,15 @@ export type MiniprogramStyleMethods = {
) => void;
}
-export type ComponentProps = IsList extends true ?
- WechatMiniprogram.Component.PropertyOptionToData :
- WechatMiniprogram.Component.PropertyOptionToData;
+export type ComponentProps = IsList extends true ?
+ PropertyOptionToData :
+ PropertyOptionToData;
export type ComponentData<
ED extends EntityDict & BaseEntityDict,
T extends keyof ED,
- FormedData extends WechatMiniprogram.Component.DataOption,
- TData extends WechatMiniprogram.Component.DataOption
+ FormedData extends DataOption,
+ TData extends DataOption
> = TData & FormedData & OakComponentData;
export type ComponentPublicThisType<
@@ -97,8 +159,8 @@ export type ComponentPublicThisType<
FormedData extends Record,
IsList extends boolean,
TData extends Record = {},
- TProperty extends WechatMiniprogram.Component.PropertyOption = {},
- TMethod extends WechatMiniprogram.Component.MethodOption = {}
+ TProperty extends PropertyOption = {},
+ TMethod extends MethodOption = {}
> = {
subscribed: Array<() => void>;
features: FD & BasicFeatures>;
@@ -135,7 +197,7 @@ export type ComponentFullThisType<
detail?: DetailType,
options?: WechatMiniprogram.Component.TriggerEventOption
) => void;
- } & OakCommonComponentMethods & OakListComponentMethods & OakSingleComponentMethods;
+ } & OakCommonComponentMethods & OakListComponentMethods & OakSingleComponentMethods;
export type OakComponentOption<
ED extends EntityDict & BaseEntityDict,
@@ -147,12 +209,10 @@ export type OakComponentOption<
FormedData extends Record,
IsList extends boolean,
TData extends Record,
- TProperty extends WechatMiniprogram.Component.PropertyOption,
+ TProperty extends PropertyOption,
TMethod extends Record,
- > = ComponentOption &
+ > = ComponentOption &
Partial<{
- data?: ((option: { features: BasicFeatures> & FD, props: ComponentProps }) => TData) | TData;
- properties: Record;
methods: TMethod;
lifetimes: {
created?(): void;
@@ -164,7 +224,7 @@ export type OakComponentOption<
show?(): void;
hide?(): void;
};
- actions?: ED[T]['Action'][] | ((this: ComponentPublicThisType<
+ actions: ED[T]['Action'][] | ((this: ComponentPublicThisType<
ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod
>) => ED[T]['Action'][]);
observers: Record any>;
@@ -347,11 +407,11 @@ export type MakeOakComponent<
FD extends Record
> = <
T extends keyof ED,
- FormedData extends WechatMiniprogram.Component.DataOption,
+ FormedData extends DataOption,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption,
- TProperty extends WechatMiniprogram.Component.PropertyOption,
- TMethod extends WechatMiniprogram.Component.MethodOption
+ TData extends DataOption,
+ TProperty extends PropertyOption,
+ TMethod extends MethodOption
>(
options: OakComponentOption<
ED,
@@ -382,8 +442,8 @@ export type WebComponentProps<
ED extends EntityDict & BaseEntityDict,
T extends keyof ED,
IsList extends boolean,
- TData extends WechatMiniprogram.Component.DataOption = {},
- TMethod extends WechatMiniprogram.Component.MethodOption = {}> = {
+ TData extends DataOption = {},
+ TMethod extends MethodOption = {}> = {
methods: TMethod & OakCommonComponentMethods
& OakListComponentMethods