使OakPage的类型更加精准

This commit is contained in:
Xu Chang 2022-04-22 19:22:39 +08:00
parent e7894dad86
commit f940d78021
3 changed files with 26 additions and 18 deletions

View File

@ -35,5 +35,5 @@
"build": "tsc",
"test": "ts-node ./test/test.ts"
},
"main": "lib/index"
"main": "src/index"
}

View File

@ -124,12 +124,12 @@ class ListNode<ED extends EntityDict, T extends keyof ED, Cxt extends Context<ED
protected children: SingleNode<ED, T, Cxt, AD>[];
protected value: Array<Partial<ED[T]['Schema']>>;
private filters: DeduceFilter<ED[T]['Schema']>[];
private filters: ED[T]['Selection']['filter'][];
private sorter?: ED[T]['Selection']['sorter'];
private pagination: Pagination;
constructor(entity: T, fullPath: string, schema: StorageSchema<ED>, cache: Cache<ED, Cxt, AD>, projection?: ED[T]['Selection']['data'],
parent?: Node<ED, keyof ED, Cxt, AD>, pagination?: Pagination, filters?: DeduceFilter<ED[T]['Schema']>[],
parent?: Node<ED, keyof ED, Cxt, AD>, pagination?: Pagination, filters?: ED[T]['Selection']['filter'][],
sorter?: ED[T]['Selection']['sorter'], action?: ED[T]['Action']) {
super(entity, fullPath, schema, cache, projection, parent, action);
this.ids = [];
@ -601,7 +601,7 @@ export class RunningNode<ED extends EntityDict, Cxt extends Context<ED>, AD exte
async createNode<T extends keyof ED>(path: string, parent?: string,
entity?: T, isList?: boolean, isPicker?: boolean, projection?: ED[T]['Selection']['data'], id?: string,
pagination?: Pagination, filters?: DeduceFilter<ED[T]['Schema']>[],
pagination?: Pagination, filters?: ED[T]['Selection']['filter'][],
sorter?: ED[T]['Selection']['sorter']) {
let node: ListNode<ED, T, Cxt, AD> | SingleNode<ED, T, Cxt, AD>;
const parentNode = parent ? await this.findNode(parent) : undefined;

View File

@ -1,5 +1,5 @@
import './polyfill';
import { Aspect, AttrIllegalError, Checker, Context, DeduceFilter, EntityDict, RowStore, StorageSchema, Trigger } from "oak-domain/lib/types";
import { Aspect, AttrIllegalError, Checker, Context, DeduceFilter, EntityDict, RowStore, SelectionResult, StorageSchema, Trigger } from "oak-domain/lib/types";
import { Feature } from '../../types/Feature';
import { initialize as init } from '../../initialize';
import { Pagination } from "../../types/Pagination";
@ -13,10 +13,11 @@ type OakComponentOption<
Cxt extends Context<ED>,
AD extends Record<string, Aspect<ED, Cxt>>,
FD extends Record<string, Feature<ED, Cxt, AD>>,
Proj extends ED[T]['Selection']['data'],
FormedData extends WechatMiniprogram.Component.DataOption
> = {
entity: T;
formData: ($rows: Partial<ED[T]['Schema']>[], features: BasicFeatures<ED, Cxt, AD> & FD) => FormedData;
formData: ($rows: SelectionResult<ED[T]['Schema'], Proj>['result'], features: BasicFeatures<ED, Cxt, AD> & FD) => FormedData;
};
interface OakPageOption<
@ -25,19 +26,20 @@ interface OakPageOption<
Cxt extends Context<ED>,
AD extends Record<string, Aspect<ED, Cxt>>,
FD extends Record<string, Feature<ED, Cxt, AD>>,
Proj extends ED[T]['Selection']['data'],
FormedData extends WechatMiniprogram.Component.DataOption
> {
entity: T;
path: string;
isList: boolean;
projection: ED[T]['Selection']['data'];
projection: Proj;
parent?: string;
append?: boolean;
pagination?: Pagination;
filters?: Array<DeduceFilter<ED[T]['Schema']>>;
filters?: Array<ED[T]['Selection']['filter']>;
sorter?: ED[T]['Selection']['sorter'];
// actions?: EntityDict[T]['Action'][];
formData: ($rows: Partial<ED[T]['Schema']>[], features: BasicFeatures<ED, Cxt, AD> & FD) => FormedData;
formData: ($rows: SelectionResult<ED[T]['Schema'], Proj>['result'], features: BasicFeatures<ED, Cxt, AD> & FD) => FormedData;
};
type OakComponentProperties = {
@ -158,7 +160,8 @@ function createPageOptions<ED extends EntityDict,
Cxt extends Context<ED>,
AD extends Record<string, Aspect<ED, Cxt>>,
FD extends Record<string, Feature<ED, Cxt, AD>>,
FormedData extends WechatMiniprogram.Component.DataOption>(options: OakPageOption<ED, T, Cxt, AD, FD, FormedData>, doSubscribe: ReturnType<typeof init>['subscribe'], features: BasicFeatures<ED, Cxt, AD> & FD) {
Proj extends ED[T]['Selection']['data'],
FormedData extends WechatMiniprogram.Component.DataOption>(options: OakPageOption<ED, T, Cxt, AD, FD, Proj, FormedData>, doSubscribe: ReturnType<typeof init>['subscribe'], features: BasicFeatures<ED, Cxt, AD> & FD) {
const { formData, isList, pagination } = options;
const componentOptions: WechatMiniprogram.Component.Options<
{
@ -329,7 +332,7 @@ function createPageOptions<ED extends EntityDict,
const { oakId, oakEntity, oakPath, oakProjection, oakParent,
oakSorter, oakFilters, oakIsPicker, oakFrom } = this.data;
assert(!(isList && oakId));
let filters: DeduceFilter<ED[T]['Schema']>[] | undefined;
let filters: ED[T]['Selection']['filter'][] | undefined;
if (oakFilters.length > 0) {
filters = oakFilters;
}
@ -380,8 +383,9 @@ function createComponentOptions<ED extends EntityDict,
Cxt extends Context<ED>,
AD extends Record<string, Aspect<ED, Cxt>>,
FD extends Record<string, Feature<ED, Cxt, AD>>,
Proj extends ED[T]['Selection']['data'],
FormedData extends WechatMiniprogram.Component.DataOption>(
options: OakComponentOption<ED, T, Cxt, AD, FD, FormedData>,
options: OakComponentOption<ED, T, Cxt, AD, FD, Proj, FormedData>,
doSubscribe: ReturnType<typeof init>['subscribe'],
features: BasicFeatures<ED, Cxt, AD> & FD) {
const { formData } = options;
@ -405,7 +409,7 @@ function createComponentOptions<ED extends EntityDict,
oakParent: String,
},
observers: {
"oakValue": async function (value: Partial<ED[T]['Schema']> | Partial<ED[T]['Schema']>[]) {
"oakValue": async function (value) {
const $rows = value instanceof Array ? value : [value];
const data = formData($rows, features);
for (const k in data) {
@ -502,7 +506,7 @@ function createComponentOptions<ED extends EntityDict,
async ready() {
const { oakPath, oakParent, oakValue } = this.data;
const $rows = oakValue instanceof Array ? oakValue : [oakValue];
const data = formData($rows as Partial<ED[T]['Schema']>[], features);
const data = formData($rows, features);
for (const k in data) {
if (data[k] === undefined) {
assign(data, {
@ -628,9 +632,10 @@ export function initialize<ED extends EntityDict, Cxt extends Context<ED>, AD ex
D extends WechatMiniprogram.Component.DataOption,
P extends WechatMiniprogram.Component.PropertyOption,
M extends WechatMiniprogram.Component.MethodOption,
Proj extends ED[T]['Selection']['data'],
IS extends WechatMiniprogram.IAnyObject = {},
FormedData extends WechatMiniprogram.Component.DataOption = {}>(
options: OakPageOption<ED, T, Cxt, AD, FD, FormedData>,
options: OakPageOption<ED, T, Cxt, AD, FD, Proj, FormedData>,
componentOptions: WechatMiniprogram.Component.Options<D, P, M, IS & OakPageInstanceProperties<ED, T, Cxt, AD, FD>, true> = {}) => {
const oakOptions = createPageOptions(options, subscribe, features);
const { properties, pageLifetimes, lifetimes, methods, data, observers } = oakOptions;
@ -667,8 +672,9 @@ export function initialize<ED extends EntityDict, Cxt extends Context<ED>, AD ex
D extends WechatMiniprogram.Component.DataOption,
P extends WechatMiniprogram.Component.PropertyOption,
M extends WechatMiniprogram.Component.MethodOption,
Proj extends ED[T]['Selection']['data'],
IS extends WechatMiniprogram.IAnyObject = {},
FormedData extends WechatMiniprogram.Component.DataOption = {}>(options: OakComponentOption<ED, T, Cxt, AD, FD, FormedData>, componentOptions: WechatMiniprogram.Component.Options<D, P, M, IS> = {}) => {
FormedData extends WechatMiniprogram.Component.DataOption = {}>(options: OakComponentOption<ED, T, Cxt, AD, FD, Proj, FormedData>, componentOptions: WechatMiniprogram.Component.Options<D, P, M, IS> = {}) => {
const oakOptions = createComponentOptions(options, subscribe, features);
const { properties, pageLifetimes, lifetimes, methods, data, observers } = oakOptions;
const { properties: p2, pageLifetimes: pl2, lifetimes: l2, methods: m2, data: d2, observers: o2, ...restOptions } = componentOptions;
@ -695,8 +701,9 @@ export type MakeOakPage<ED extends EntityDict, Cxt extends Context<ED>, AD exten
D extends WechatMiniprogram.Component.DataOption,
P extends WechatMiniprogram.Component.PropertyOption,
M extends WechatMiniprogram.Component.MethodOption,
Proj extends ED[T]['Selection']['data'],
IS extends WechatMiniprogram.IAnyObject = {},
FormedData extends WechatMiniprogram.Component.DataOption = {}>(options: OakPageOption<ED, T, Cxt, AD, FD, FormedData>,
FormedData extends WechatMiniprogram.Component.DataOption = {}>(options: OakPageOption<ED, T, Cxt, AD, FD, Proj, FormedData>,
componentOptions: WechatMiniprogram.Component.Options<D & FormedData, P, M, IS & OakPageInstanceProperties<ED, T, Cxt, AD, FD>, true>) => string;
export type MakeOakComponent<ED extends EntityDict, Cxt extends Context<ED>, AD extends Record<string, Aspect<ED, Cxt>>, FD extends Record<string, Feature<ED, Cxt, AD>>> = <
@ -704,6 +711,7 @@ export type MakeOakComponent<ED extends EntityDict, Cxt extends Context<ED>, AD
D extends WechatMiniprogram.Component.DataOption,
P extends WechatMiniprogram.Component.PropertyOption,
M extends WechatMiniprogram.Component.MethodOption,
Proj extends ED[T]['Selection']['data'],
IS extends WechatMiniprogram.IAnyObject = {},
FormedData extends WechatMiniprogram.Component.DataOption = {}>(options: OakComponentOption<ED, T, Cxt, AD, FD, FormedData>,
FormedData extends WechatMiniprogram.Component.DataOption = {}>(options: OakComponentOption<ED, T, Cxt, AD, FD, Proj, FormedData>,
componentOptions: WechatMiniprogram.Component.Options<D & FormedData, P, M, IS>) => string;