colshacol
11/30/2017 - 1:16 AM

Modeling.

Modeling.

// Describe the shape the User JSON should have arriving from the server.

type RawUser = {
  name: string,
  age: number,
  languages?: Array<string>,
  traits?: {
    cool: boolean,
    smart: boolean,
    fast: boolean,
  }
}

// Describe the shape that a User object will have once we receive it
// and spice it up to be used in our client. (The User will have the
// original values from JSON and also some added methods.)

type User = RawUser & {
  setName(name: string): void,
  setAge(age: number): void,
  toggleCoolTrait(): void,
  getAgePlus(x: number): number,
};

// A function to take the JSON user data and turn it into a User
// that is ready and compatible with our codebase.

const generateUser = (userData: RawUser): User => {
  return {
    ...userData,
    setName(name) { /* ... */ },
    setAge(age) { /* ... */ },
    toggleCoolTrait() { /* ... */ },
    getAgePlus(x) { return 10 },
  }
}

// Use the function, generate a User.
const Tommy = generateUser({
  name: 'Tommy',
  age: 39,
  languages: [],
  traits: {
    cool: true,
    smart: true,
    fast: true
  }
});

// Try it out.
Tommy.setAge(99);
Tommy.toggleCoolTrait();
Tommy.getAgePlus('dogs'); // ERR expected number.


// Use the function, generate another User.
const Frank = generateUser({
  name: 'Frank',
  languages: [],
  traits: {
    cool: true,
    smart: true,
    fast: true
  }
});

// ERR: Frank requires an age!