Skip to main content

Field

A field is the most basic building block of fielded. It's where data is usually input by the user, and ultimately, where it's stored.

Instantiating a Field​

There are some ways of creating a field. Each of the following methods creates an instance of Field that is bound to a specific type.

Field.text(initialValue)​

Creates a text field, optionally taking an initial value. Returns a Field<string | undefined>.

Field.number(initialValue)​

Creates a number field, optionally taking an initial value. Returns a Field<number | undefined>.

Field.fromValidator(validator, initialValue)​

Creates a field whose type is inferred from a validator, optionally taking an initial value.

const field: Field<string> = Field.fromValidator((value: unknown): asserts value is string => {
if (typeof value !== "string") {
throw new Error("Not a string");
}
});

See .addValidators() for more on the validators usage.

Properties​

.type​

What the underlying type of the field is. Either text or number.

.rawValue​

Observable current value of the field (if any).

const nameField = Field.text("John Doe");

console.log(nameField.rawValue); // prints "John Doe"

.value​

Observable value of the field if valid. If invalid, it's undefined.

const username = Field.text();
username.addValidators((value) => {
if (value === "john") {
throw new Error("taken");
}
});

username.set("john");
console.log(username.value); // prints undefined

username.set("johnny");
console.log(username.value); // prints "johnny"

.validation​

A Validation object representing the field's state of validation. Undefined unless the field value has been set before.

.errors​

Observable list of validation errors of the field. Shorthand for field.validation.errors.

.error​

Observable validation error of the field, if any. Shorthand for field.validation.errors[0].

Methods​

.set(value)​

Updates the value of the field to be value, and validates it. Returns the field itself, useful for chaining.

const value = Field.number().set(42).value;
console.log(value); // prints 42

.reset()​

Resets the field to its initial value, and removes validation state.

const field = Field.number(42);
field.set(15).reset();
console.log(field.value); // prints 42

.validate()​

Triggers validation using the field's current value. Returns a promise for the finished validation state.

const field = Field.number(42);
const validation = await field.validate();
if (validation.state === "valid") {
console.log(`The field's value ${validation.value} is valid`);
}

.addValidators(...validators)​

Adds one or more validators.
A validator is either a function, or an object with a validate function. It takes the current field value and throws an error, or returns a promise that rejects, if the value is invalid.

const required = {
validate(value: string | undefined) {
if (!value) {
throw new Error("Please type a value.");
}
},
};

function validateWeekDay(value: string | undefined) {
if (value === "saturday" || value === "sunday") {
throw new Error("Please choose a week day.");
}
}

const day = Field.text().addValidators(required, validateWeekDay);
day.set("sunday");
console.log(day.error); // "Please choose a week day."

.setError(error)​

Sets the field to an invalid state with the specified error. Returns the field itself, useful for chaining.

const name = Field.text();
name.setError("Please type a name.");
console.log(name.error); // "Please type a name."