Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

query的类型没有自推倒,那类型如何定义? #88

Closed
soakit opened this issue Sep 22, 2023 · 8 comments
Closed

query的类型没有自推倒,那类型如何定义? #88

soakit opened this issue Sep 22, 2023 · 8 comments

Comments

@soakit
Copy link

soakit commented Sep 22, 2023

No description provided.

@github-actions
Copy link

Thank feedback. We will check it later:-)

@soakit
Copy link
Author

soakit commented Sep 22, 2023

image

将query, command, events都独立文件处理,以免domain过大。但这样query的类型就变成any了

@soakit
Copy link
Author

soakit commented Sep 22, 2023

image

想将query, command, events都独立文件处理,避免domain文件太大,有没有好的解决方案?

@Lucifier129
Copy link
Collaborator

Lucifier129 commented Sep 22, 2023

理论上不会产生这个问题,需要检查一下 getQueries 自身的类型定义是否健全。

此外,Remesh 约束了命名规范,getBuyer 不是合法的 Query,合法的 Query name 是大写字母开头且以 Query 作为后缀。

@soakit
Copy link
Author

soakit commented Sep 23, 2023

image
还有一个问题,这个传入的events的类型怎么获取?

@Lucifier129
Copy link
Collaborator

你的截图里的代码,有很多不规范的地方。

获取 events 类型其实很简单,只要在编辑器里 hover 上去查看一个普通 event 的类型,复制出来组成一个 object type 即可。

你的场景其实是要定义一个 Remesh Modules,一般做法如下:

import { Remesh, RemeshCommandOutput, RemeshDomainContext } from 'remesh'

type Buyer = {

}

type OrderState = {
  buyer: Buyer
}

/**
 * 用 getters, setters and callbacks
 * 不要直接依赖具体的 domain 对象
 */
type BuyerModuleOptions = {
  onBuyerUpdated: () => RemeshCommandOutput
}

const BuyerModule = (domain: RemeshDomainContext, options: BuyerModuleOptions) => {
  const OrderState = domain.state({
    name: 'OrderState',
    default: {}
  })


  const BuyerUpdatedEvent = domain.event({
    name: 'BuyerUpdatedEvent',
  })

  const UpdateBuyerCommand = domain.command({
    name: 'UpdateBuyerCommand',
    impl: ({ get }, buyer: Buyer) => {
      const newState = {
        ...get(OrderState),
        buyer
      }

      return [
        OrderState.new(newState),
        BuyerUpdatedEvent(),
        options.onBuyerUpdated()
      ]
    }
  })


  return {
    command: {
      UpdateBuyerCommand
    },
    event: {
      BuyerUpdatedEvent
    }
  }
}

类型推导如下:

image

@soakit
Copy link
Author

soakit commented Sep 23, 2023

这里再拆分一个BuyerModule,理解到了。但我的想法是当成员比较小时,不必单独拆分。

之前的问题,单个domain怎么去拆分它的query, command, event, effect作为文件独立管理,一个简单的todoDomain,也有240多行的代码,如何避免domain文件太长难以阅读、多人协作的文件冲突等,如何解决请指教。

示例代码

@Lucifier129
Copy link
Collaborator

240 行的 todo domain 是正常的,文件长不意味着一定会难以阅读,还是要看代码自身的复杂度。多人协作文件冲突按照 git 的方式解决。

单个 domain 也不必按照 query, command, event, effect 的分类进行拆分,而是按照 feature 来拆分,一个 feature 可以有自己的一套 query, command, event ,effect,按照上面示意过的 Remesh Module 的风格进行设计和封装。跟 react component 通过 react hooks 拆分出去是一样的。

todo domain 这里有个拆分版的 todo domain,总体代码更长,但更灵活和解耦。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants