diff --git a/src/mol-state/action.ts b/src/mol-state/action.ts index cd867b8e5bc1657bd7465630b7789ebf75e7e29c..264a9266ece3ad3f5213ae2ca2a711378e5e2c99 100644 --- a/src/mol-state/action.ts +++ b/src/mol-state/action.ts @@ -78,21 +78,15 @@ namespace StateAction { } export namespace Builder { - type ParamDefinition<P> = { [K in keyof P]-?: PD.Base<P[K]> } - export interface Type<A extends StateObject.Ctor, P extends { }> { from?: A | A[], - params?: ParamDefinition<P> | ((a: StateObject.From<A>, globalCtx: any) => ParamDefinition<P>) + params?: PD.For<P> | ((a: StateObject.From<A>, globalCtx: any) => PD.For<P>) } export interface Root { - <A extends StateObject.Ctor, P extends { }>(info: Type<A, P>): Define<StateObject.From<A>, Params<P>> + <A extends StateObject.Ctor, P extends { }>(info: Type<A, P>): Define<StateObject.From<A>, PD.Normalize<P>> } - type Optionals<P> = { [K in keyof P]-?: undefined extends P[K] ? K : never }[keyof P] - type NonOptionals<P> = { [K in keyof P]-?: undefined extends P[K] ? never: K }[keyof P] - type Params<P> = Pick<P, NonOptionals<P>> & Partial<Pick<P, Optionals<P>>> - export interface Define<A extends StateObject, P> { <T>(def: DefinitionBase<A, T, P>): StateAction<A, T, P> } diff --git a/src/mol-state/transformer.ts b/src/mol-state/transformer.ts index 2c60fbacb6ba6d50a71a6b96ff40a5432cc6721c..448272e76a94324ec9c08b773263fc7d7f17be62 100644 --- a/src/mol-state/transformer.ts +++ b/src/mol-state/transformer.ts @@ -147,23 +147,17 @@ export namespace Transformer { } export namespace Builder { - type ParamDefinition<P> = { [K in keyof P]-?: PD.Base<P[K]> } - export interface Type<A extends StateObject.Ctor, B extends StateObject.Ctor, P extends { }> { name: string, from: A | A[], to: B | B[], - params?: ParamDefinition<P> | ((a: StateObject.From<A>, globalCtx: any) => ParamDefinition<P>) + params?: PD.For<P> | ((a: StateObject.From<A>, globalCtx: any) => PD.For<P>) } export interface Root { - <A extends StateObject.Ctor, B extends StateObject.Ctor, P extends { }>(info: Type<A, B, P>): Define<StateObject.From<A>, StateObject.From<B>, Params<P>> + <A extends StateObject.Ctor, B extends StateObject.Ctor, P extends { }>(info: Type<A, B, P>): Define<StateObject.From<A>, StateObject.From<B>, PD.Normalize<P>> } - type Optionals<P> = { [K in keyof P]-?: undefined extends P[K] ? K : never }[keyof P] - type NonOptionals<P> = { [K in keyof P]-?: undefined extends P[K] ? never: K }[keyof P] - type Params<P> = Pick<P, NonOptionals<P>> & Partial<Pick<P, Optionals<P>>> - export interface Define<A extends StateObject, B extends StateObject, P> { (def: DefinitionBase<A, B, P>): Transformer<A, B, P> } diff --git a/src/mol-util/param-definition.ts b/src/mol-util/param-definition.ts index f6cd427639ebd0822411302260f0a5cf76bef280..77848d8e78ccea62444eb56f929756b53ff0ea4b 100644 --- a/src/mol-util/param-definition.ts +++ b/src/mol-util/param-definition.ts @@ -181,6 +181,11 @@ export namespace ParamDefinition { export type Params = { [k: string]: Any } export type Values<T extends Params> = { [k in keyof T]: T[k]['defaultValue'] } + type Optionals<P> = { [K in keyof P]-?: undefined extends P[K] ? K : never }[keyof P] + type NonOptionals<P> = { [K in keyof P]-?: undefined extends P[K] ? never: K }[keyof P] + export type Normalize<P> = Pick<P, NonOptionals<P>> & Partial<Pick<P, Optionals<P>>> + export type For<P> = { [K in keyof P]-?: Base<P[K]> } + export function getDefaultValues<T extends Params>(params: T) { const d: { [k: string]: any } = {} for (const k of Object.keys(params)) {