tldr; Github @reggi/linear-builder-class代码使用线性构建器类模式生成类
我的目标是定义类型并确保通用值从一种方法到另一种方法“匹配”。
new Example()
.stringOrNumber(1)
.toObject((knowsItsANumber) => {
return { yepStillKnows: knowsItsANumber }
})
.chainMe(({ yepStillKnows }) => {
return yepStillKnows + 1
})
.done (stillANumber => {
console.log(stillANumber) // number
})
注意:这是
example_two
实现此目的的一种常见方法是维护每个方法返回的单独的类实例,而不是返回该类别并拥有一个常规类,其中所有方法都在该类别上。使用后一个方法,每个“集”值无法动态键入。通过传递一个值并返回新类实例,您可以跟踪类型。这是一个线性过程,因为您只能以同一顺序设置一个属性。由于仿制药的工作方式,有效执行此操作的唯一方法是创建和返回新的类实例,从而导致许多样板代码。这就是该工具的出现。这创建了启动此工具所需的脚手架类。
什么是builder class?这是一种类创建的模式,其中类方法通常返回this
,然后您将方法链接在一起,内部类状态管理变化,一个示例类似于builder.getProduct().listParts()
。有了这个项目,我有兴趣从一个小定义中创建为类生成代码。
request*: Request
pathname*: string
match: MatchHandler<M>
data: DataHandler<M, D>
component: ComponentHandler<M>
注意:
*
语法意味着该类型是“本机”类型,使用importsFrom
选项时不应包括在内。
用这些方法构建一类:
new Leaf()
.request(new Request('https://example.com'))
.pathname('/hello-world')
.match(async (_req, ctx) => {
const match = new URLPattern({ pathname: ctx.pathname }).exec(ctx.url.pathname)
const age = ctx.url.searchParams.get('age')
if (!match) return null
if (!age) throw new Error('missing age param')
const x = await Promise.resolve({ age })
return x
})
.data(async data => {
const x = await Promise.resolve({ ...data })
return { age: parseInt(x.age)}
})
.component(props => {
return <div>{props.age}</div>
})
其中返回值是具有这些属性的类。
{
request: Request
pathname: string,
match: MatchHandler<M>,
data: DataHandler<M, D>,
component: ComponentHandler<M>,
}
使用deno创建了此示例,您可以使用:
构建代码
deno run -A ./example/build.ts > example/leaf.ts
并使用:
运行用法
deno run example/usage.tsx