Attribute casting provides functionality similar to accessors and mutators without requiring you to define any additional methods on your model.
Supported casts are:
StringCast
NumberCast
BooleanCast
ArrayCast
import { StringCast } from 'pinia-orm/casts'class User extends Model { static entity = 'users' static fields () { return { id: this.attr(null), firstName: this.string(''), lastName: this.string('') } } static casts () { return { firstName: StringCast, lastName: StringCast, } }}const user = useRepo(User).save({ firstName: 'John', lastName: 1234})console.log(user.lastName) // '1234'
import { ArrayCast } from 'pinia-orm/casts'class User extends Model { static entity = 'users' @Cast(() => ArrayCast) @Attr('{}') declare meta: Record<string, any>}console.log(new User({ meta: '{"name":"John", "age":30, "car":null}' }).meta)// { name: 'John', age: 30, car: null }
If you like decorators you can also use the Cast
decorator to apply a cast to an value
Pina ORM gives you also the possibility to define your own cast and use them.
class CustomCast extends CastAttribute { get(value?: any): any { return typeof value === 'string' ? `string ${value}` : value } set(value?: any): any { return this.get(value) }}class User extends Model { static entity = 'users' @Attr('{}') declare name: string static casts() { return { name: CustomCast, } }}console.log(new User({ name: 'John' }).name) // 'string John'
class CustomCast extends CastAttribute { get(value?: any): any { return typeof value === 'string' ? `string ${value}` : value } set(value?: any): any { return this.get(value) }}class User extends Model { static entity = 'users' @Cast(() => CustomCast) @Attr('test') declare name: string}console.log(new User({ name: 'John' }).name) // 'string John'
Yon can also define casts where you pass custom parameters to change the behaviour
class CustomCast extends CastAttribute { static parameters = { type: 'string', } get(value?: any): any { const type = this.getParameters().type return typeof value === type ? `${type} ${value}` : value } set(value?: any): any { return this.get(value) }}class User extends Model { static entity = 'users' @Attr('{}') declare name: string static casts() { return { name: CustomCast.withParameters({ type: 'number' }), } }}console.log(new User({ name: 'John' }).name) // 'John'console.log(new User({ name: 1 }).name) // 'number 1'