Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion dist/index.d.mts
Original file line number Diff line number Diff line change
Expand Up @@ -326,4 +326,8 @@ declare class PhoneNumberValidator extends Validator {
call(value: string): void;
}

export { DynamicMinDateValidator, EmailValidator, Form, FormArray, FormField, type FormFieldsRecord, FormLevelValidator, type FormTypeUnion, type FormValue, type GetFormFieldKeys, type GetFormFieldNames, type IDynamicFormValidators, type IForm, type IFormArray, type IFormArrayKwargs, type IFormField, type IFormFieldError, type IFormFieldKwargs, type IFormInstance, type IFormLevelValidator, type IValidator, MaxDateValidator, MaximumValueValidator, MinDateValidator, MinLengthValidator, MinimumValueValidator, MustMatchValidator, type OptionalFormArgs, PatternValidator, PhoneNumberValidator, type PickByValue, type PickFormValue, RequiredValidator, type TArrayOfFormFieldValues, type TFormFieldTypeCombos, type TFormFieldTypeOpts, type TFormInstance, type TFormInstanceFields, TrueFalseValidator, UrlValidator, Validator, fieldGetter, isFormArray, isFormField, isNumber, isNumberOrFloat, notNullOrUndefined };
type ExtractFormFields<T> = {
[K in keyof T]: T[K] extends IFormField<any> | IFormArray<any> ? T[K] : never;
};

export { DynamicMinDateValidator, EmailValidator, type ExtractFormFields, Form, FormArray, FormField, type FormFieldsRecord, FormLevelValidator, type FormTypeUnion, type FormValue, type GetFormFieldKeys, type GetFormFieldNames, type IDynamicFormValidators, type IForm, type IFormArray, type IFormArrayKwargs, type IFormField, type IFormFieldError, type IFormFieldKwargs, type IFormInstance, type IFormLevelValidator, type IValidator, MaxDateValidator, MaximumValueValidator, MinDateValidator, MinLengthValidator, MinimumValueValidator, MustMatchValidator, type OptionalFormArgs, PatternValidator, PhoneNumberValidator, type PickByValue, type PickFormValue, RequiredValidator, type TArrayOfFormFieldValues, type TFormFieldTypeCombos, type TFormFieldTypeOpts, type TFormInstance, type TFormInstanceFields, TrueFalseValidator, UrlValidator, Validator, fieldGetter, isFormArray, isFormField, isNumber, isNumberOrFloat, notNullOrUndefined };
6 changes: 5 additions & 1 deletion dist/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,4 +326,8 @@ declare class PhoneNumberValidator extends Validator {
call(value: string): void;
}

export { DynamicMinDateValidator, EmailValidator, Form, FormArray, FormField, type FormFieldsRecord, FormLevelValidator, type FormTypeUnion, type FormValue, type GetFormFieldKeys, type GetFormFieldNames, type IDynamicFormValidators, type IForm, type IFormArray, type IFormArrayKwargs, type IFormField, type IFormFieldError, type IFormFieldKwargs, type IFormInstance, type IFormLevelValidator, type IValidator, MaxDateValidator, MaximumValueValidator, MinDateValidator, MinLengthValidator, MinimumValueValidator, MustMatchValidator, type OptionalFormArgs, PatternValidator, PhoneNumberValidator, type PickByValue, type PickFormValue, RequiredValidator, type TArrayOfFormFieldValues, type TFormFieldTypeCombos, type TFormFieldTypeOpts, type TFormInstance, type TFormInstanceFields, TrueFalseValidator, UrlValidator, Validator, fieldGetter, isFormArray, isFormField, isNumber, isNumberOrFloat, notNullOrUndefined };
type ExtractFormFields<T> = {
[K in keyof T]: T[K] extends IFormField<any> | IFormArray<any> ? T[K] : never;
};

export { DynamicMinDateValidator, EmailValidator, type ExtractFormFields, Form, FormArray, FormField, type FormFieldsRecord, FormLevelValidator, type FormTypeUnion, type FormValue, type GetFormFieldKeys, type GetFormFieldNames, type IDynamicFormValidators, type IForm, type IFormArray, type IFormArrayKwargs, type IFormField, type IFormFieldError, type IFormFieldKwargs, type IFormInstance, type IFormLevelValidator, type IValidator, MaxDateValidator, MaximumValueValidator, MinDateValidator, MinLengthValidator, MinimumValueValidator, MustMatchValidator, type OptionalFormArgs, PatternValidator, PhoneNumberValidator, type PickByValue, type PickFormValue, RequiredValidator, type TArrayOfFormFieldValues, type TFormFieldTypeCombos, type TFormFieldTypeOpts, type TFormInstance, type TFormInstanceFields, TrueFalseValidator, UrlValidator, Validator, fieldGetter, isFormArray, isFormField, isNumber, isNumberOrFloat, notNullOrUndefined };
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from './forms'
export * from './interfaces'
export * from './utils'
export * from './validators'
export * from './types'
6 changes: 6 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { IFormArray, IFormField } from "./interfaces";

export type ExtractFormFields<T> = {
[K in keyof T]: T[K] extends IFormField<any> | IFormArray<any> ? T[K] : never;
};

23 changes: 22 additions & 1 deletion test/test-forms.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as assert from 'assert'
import { Equals, Expect } from './type-utils'
import { Equals, Expect } from './type-utils';

import { FormArray, FormField, Form } from '../src/forms'
import { GetFormFieldNames, IFormArray, IFormField } from '../src/interfaces'
Expand All @@ -14,6 +14,7 @@ import {
DynamicMinDateValidator,
UrlValidator,
} from '../src/validators'
import { ExtractFormFields } from '../src'

type IUserAddressForm = {
street: IFormField
Expand Down Expand Up @@ -429,4 +430,24 @@ describe('Forms', () => {
>
})
})

describe('# ExtractFormFields', () => {
class MyForm extends Form<ExtractFormFields<typeof MyForm>> {
static name = new FormField()
static age = new FormField<number>()
}
type TMyForm = MyForm & ExtractFormFields<typeof MyForm>
it('should extract the form fields', () => {
let myForm = new MyForm() as TMyForm
assert.equal(myForm.name instanceof FormField, true)
assert.equal(myForm.age instanceof FormField, true)
})
it('should have age as FormField<number>', () => {
let myForm = new MyForm() as TMyForm
type AgeFieldType = typeof myForm.age
type ExpectedType = FormField<number>
type isCorrectType = [Expect<Equals<AgeFieldType, ExpectedType>>]

})
})
})
Loading