Skip to content

Commit ba993a6

Browse files
authored
Merge pull request #28 from thinknimble/feature/new-types
Feature/new types
2 parents 70b97c5 + 06794af commit ba993a6

5 files changed

Lines changed: 39 additions & 3 deletions

File tree

dist/index.d.mts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,4 +326,8 @@ declare class PhoneNumberValidator extends Validator {
326326
call(value: string): void;
327327
}
328328

329-
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 };
329+
type ExtractFormFields<T> = {
330+
[K in keyof T]: T[K] extends IFormField<any> | IFormArray<any> ? T[K] : never;
331+
};
332+
333+
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 };

dist/index.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,4 +326,8 @@ declare class PhoneNumberValidator extends Validator {
326326
call(value: string): void;
327327
}
328328

329-
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 };
329+
type ExtractFormFields<T> = {
330+
[K in keyof T]: T[K] extends IFormField<any> | IFormArray<any> ? T[K] : never;
331+
};
332+
333+
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 };

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './forms'
22
export * from './interfaces'
33
export * from './utils'
44
export * from './validators'
5+
export * from './types'

src/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { IFormArray, IFormField } from "./interfaces";
2+
3+
export type ExtractFormFields<T> = {
4+
[K in keyof T]: T[K] extends IFormField<any> | IFormArray<any> ? T[K] : never;
5+
};
6+

test/test-forms.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as assert from 'assert'
2-
import { Equals, Expect } from './type-utils'
2+
import { Equals, Expect } from './type-utils';
33

44
import { FormArray, FormField, Form } from '../src/forms'
55
import { GetFormFieldNames, IFormArray, IFormField } from '../src/interfaces'
@@ -14,6 +14,7 @@ import {
1414
DynamicMinDateValidator,
1515
UrlValidator,
1616
} from '../src/validators'
17+
import { ExtractFormFields } from '../src'
1718

1819
type IUserAddressForm = {
1920
street: IFormField
@@ -429,4 +430,24 @@ describe('Forms', () => {
429430
>
430431
})
431432
})
433+
434+
describe('# ExtractFormFields', () => {
435+
class MyForm extends Form<ExtractFormFields<typeof MyForm>> {
436+
static name = new FormField()
437+
static age = new FormField<number>()
438+
}
439+
type TMyForm = MyForm & ExtractFormFields<typeof MyForm>
440+
it('should extract the form fields', () => {
441+
let myForm = new MyForm() as TMyForm
442+
assert.equal(myForm.name instanceof FormField, true)
443+
assert.equal(myForm.age instanceof FormField, true)
444+
})
445+
it('should have age as FormField<number>', () => {
446+
let myForm = new MyForm() as TMyForm
447+
type AgeFieldType = typeof myForm.age
448+
type ExpectedType = FormField<number>
449+
type isCorrectType = [Expect<Equals<AgeFieldType, ExpectedType>>]
450+
451+
})
452+
})
432453
})

0 commit comments

Comments
 (0)