Skip to content

Instantly share code, notes, and snippets.

@emkis
Created May 14, 2022 03:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emkis/32fac5cd550a4463a28955d28f305d49 to your computer and use it in GitHub Desktop.
Save emkis/32fac5cd550a4463a28955d28f305d49 to your computer and use it in GitHub Desktop.
TypeScript Patterns in a functional approach
type ShallowObject = Record<string, string | number | boolean>
type User = Partial<{
name: string
email: string
}> & ShallowObject
type UserBuilder = {
addName: (name: string) => UserBuilder
addEmail: (email: string) => UserBuilder
addProperties: (properties: ShallowObject) => UserBuilder
build: () => User
}
function buildUser(): UserBuilder {
let user: User = {}
const buildTools: UserBuilder = {
addName(name: string) {
user.name = name
return buildTools
},
addEmail(email) {
user.email = email
return buildTools
},
addProperties(properties: ShallowObject) {
user = { ...user, ...properties }
return buildTools
},
build: () => user,
}
return {
addName: buildTools.addName,
addEmail: buildTools.addEmail,
addProperties: buildTools.addProperties,
build: buildTools.build,
}
}
const loremIpsum = buildUser()
.addName('Lorem Ipsum')
.addEmail('lipsum@gmail.com')
.addProperties({ age: 1742, isRandomText: true })
.build()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment