Property
    PrimitiveValue
  
  Specify a property with a default primitive value. Using this signature will result in strict type checking being applied to this property.
import { ObservableObject } from "can/everything";
class Person extends ObservableObject {
  static props = {
    age: 72
  };
}
const me = new Person();
me.age; // -> 72
me.age = "45"; // throws
    function()
  
  Specify a property by defining its type as a primitive constructor. This can be String, Number, or Boolean. Using this signature results in strict type checking for this property.
import { ObservableObject } from "can/everything";
class Person extends ObservableObject {
  static props = {
    age: Number
  };
}
const me = new Person();
me.age = 75;
me.age; //-> 75
me.age = "45"; // throws
    function()
  
  Specify a property by defining its type as a constructor. This can be any constructor function, such as another ObservableObject, builtins like Date, or plain JavaScript constructor functions.
Specify a constructor function as a property's value will result in strict type checking for this property.
import { ObservableObject } from "can/everything";
class Occupation extends ObservableObject {}
class Person extends ObservableObject {
  static props = {
    occupation: Occupation,
    birthday: Date
  };
}
const me = new Person({
  birthday: new Date(1970, 2, 4),
  occupation: new Occupation()
});
me.birthday = "1970/3/19"; // throws
    TypeObject
  
  Specify a property as a special TypeObject. Most of the time you'll use this in conjunction with can-type to specify a type.
import { ObservableObject, type } from "can/everything";
class Person extends ObservableObject {
  static props = {
    first: type.check(String),
    last: type.check(String),
    middle: type.maybe(String)
  };
}
const me = new Person({
  first: "Michael",
  last: "Jordan"
});
console.log(me);
In the above example first and last use [can-type.check] which does strict type checking. middle uses [can-type.maybe] which accepts a String, null, or undefined.
These methods on can-type produce a TypeObject which looks like below:
const dateType = {
  [Symbol.for("can.new")](value) {
    return new Date(value);
  },
  [Symbol.for("can.isMember")](value) {
    return value instanceof Date;
  }
};
    function()
  
  Specify a property as a function sets the property to type: Function and uses the provided function as the default value. A use-case for this signature is to have a can-stache renderer as a default template while allowing consumers of your component to provide an alternative renderer.
import { ObservableObject, stache } from "can/everything";
// This is a function
const headerView = stache(`
  <header>
    <h1>{{title}} page</h1>
  </header>
`);
class ViewModel extends ObservableObject {
  static props = {
    header: headerView
  };
}
Returns
 {undefined}: 
    DefinitionObject
  
  Define a property through a DefinitionObject. This allows you define several different behaviors (as shown in the sidebar).
import { ObservableObject, type } from "can/everything";
class Person extends ObservableObject {
  static props = {
    age: {
      type: type.convert(Number),
      default: 1
    },
    birthday: {
      type: type.check(Date),
      set( newVal, current ) {
        if(newVal > new Date()) {
          console.warn('Birthday cannot be greater than today');
          return current;
        }
        return newVal;
      }
    }
  };
}
const me = new Person({
  age: 6
});
console.log(me);
 GitHub
GitHub Twitter
Twitter