@fluent-form/core
Version:
An Angular dynamic forms library powered by Fluent API and JSON.
49 lines (48 loc) • 1.69 kB
TypeScript
import type { SafeAny } from '@ngify/core';
interface Schema {
[k: string]: SafeAny;
schemas?: Schema[];
}
declare const COMPOSE_KEY = "schemas";
export declare function applyRoot(schema: Schema): void;
declare const BUILD_KEY = "build";
export declare function composeBuilder<T>(): Builder<T>;
/**
* Determines whether the value is a builder.
*/
export declare function isBuilder<T = unknown>(value: SafeAny): value is StableBuilder<T>;
type ComposeKey = typeof COMPOSE_KEY;
type BuildKey = typeof BUILD_KEY;
type Buildable = Record<BuildKey, unknown>;
/** Get the non-nullable and required keys of an interface. */
type NonNullableKey<T> = {
[K in keyof T]-?: Record<K, T[K]> extends {
[_ in K]-?: T[K];
} ? K : never;
}[keyof T];
/**
* @template T 原型
* @template C 候选
* @template N 必填字段
* @template S 已选字段
* @template B 可以构建
*/
type _Builder<T extends Buildable, C extends keyof T, N extends keyof T, S extends keyof T = never, B extends BuildKey = never> = {
[K in keyof Pick<T, Exclude<C, S> | B>]-?: (K extends BuildKey ? () => Pick<T, S> : (val: K extends ComposeKey ? () => SafeAny : T[K]) => _Builder<T, C, N, S | K, [
N
] extends [S | K] ? BuildKey : never>);
};
/**
* @template T 原型
*/
export type Builder<T> = _Builder<T & Buildable, keyof T, NonNullableKey<T>>;
export type StableBuilder<T> = Record<BuildKey, () => T>;
/**
* @template T 原型
* @template S 已选字段
* @template N 必填字段
*/
export type UnstableBuilder<T, S extends keyof T, N extends keyof T = NonNullableKey<T>> = _Builder<T & Buildable, keyof T, N, S, [
N
] extends [S] ? BuildKey : never>;
export {};