Casts
Defining Casts
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
- DateCast
via casts method
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'via decorator
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 a value.
Defining Custom Casts
Pina ORM gives you also the possibility to define your own cast and use them.
via casts method
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'via decorator
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'with parameters
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'