UNPKG

@modular-component/with-default-props

Version:

ModularComponent stage for handling default props. Part of the @modular-component/default package.

30 lines 1.94 kB
import { ModularContext, GetConstraintFor, GetValueGetterFor, StageParams, StageReturn } from '@modular-component/core/extend'; type NonNullableFields<Type> = { [key in keyof Type]-?: undefined extends Type[key] ? never : key; }[keyof Type]; type NullableFields<Type> = { [key in keyof Type]: undefined extends Type[key] ? key : never; }[keyof Type]; type OptionalNullable<Type> = { [key in NonNullableFields<Type>]: Type[key]; } & { [key in NullableFields<Type>]?: Type[key]; }; type Merge<Props, DefaultProps extends Partial<Props>> = OptionalNullable<{ [key in keyof Props | keyof DefaultProps]-?: key extends keyof Props ? key extends keyof DefaultProps ? Props[key] extends undefined | infer U ? U : Props[key] : Props[key] : DefaultProps[key]; }> extends infer U ? { [key in keyof U]: U[key]; } : never; type OnlyRequiredInConstraint<Original, Constraint> = { [key in keyof Constraint & keyof Original]: undefined extends Original[key] ? undefined extends Constraint[key] ? never : key : never; }[keyof Constraint & keyof Original]; type Constraint<Context extends ModularContext> = Partial<Context['props']> & Pick<GetConstraintFor<Context, 'props'>, OnlyRequiredInConstraint<Context['props'], GetConstraintFor<Context, 'props'>>> extends infer U ? { [key in keyof U]: U[key]; } : never; export declare function defaultProps<Context extends ModularContext, Default extends Constraint<Context>>(useDefault: GetValueGetterFor<Context, 'props', Default>): (_?: Context | undefined) => { field: "props"; provide: (args: import("@modular-component/core/extend").GetArgsFor<Context, "props">) => Merge<Context["props"], Default>; }; export type WithDefaultProps<Context extends ModularContext> = <Default extends Constraint<Context>>(...args: StageParams<typeof defaultProps<Context, Default>>) => StageReturn<typeof defaultProps<Context, Default>>; export {}; //# sourceMappingURL=index.d.ts.map