â€ð·ðª线性班级构建器
#javascript #typescript #oop #deno

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

Cover Attribution Creative Commons