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!