{"id":28403874,"url":"https://github.com/kunduin/dva-toolkit","last_synced_at":"2025-06-27T08:30:44.730Z","repository":{"id":57217326,"uuid":"364554243","full_name":"Kunduin/dva-toolkit","owner":"Kunduin","description":"A great dva typescript support toolkit inspired by @redux/toolkit","archived":false,"fork":false,"pushed_at":"2021-05-08T02:09:21.000Z","size":615,"stargazers_count":16,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-25T06:54:44.029Z","etag":null,"topics":["dva","redux","redux-saga","tool"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kunduin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-05T11:29:25.000Z","updated_at":"2023-10-11T12:37:16.000Z","dependencies_parsed_at":"2022-08-28T21:00:33.555Z","dependency_job_id":null,"html_url":"https://github.com/Kunduin/dva-toolkit","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Kunduin/dva-toolkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kunduin%2Fdva-toolkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kunduin%2Fdva-toolkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kunduin%2Fdva-toolkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kunduin%2Fdva-toolkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kunduin","download_url":"https://codeload.github.com/Kunduin/dva-toolkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kunduin%2Fdva-toolkit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262222109,"owners_count":23277362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dva","redux","redux-saga","tool"],"created_at":"2025-06-01T19:11:06.549Z","updated_at":"2025-06-27T08:30:44.647Z","avatar_url":"https://github.com/Kunduin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dva Toolkit\n\n![](https://img.shields.io/github/workflow/status/kunduin/dva-toolkit/CI)\n![](https://img.shields.io/npm/v/dva-toolkit)\n![](https://img.shields.io/npm/l/dva-toolkit)\n![](https://img.shields.io/bundlephobia/min/dva-toolkit) \n\nDva Toolkit 是为了给 Dva 社区带来 @redux/toolkit 一样的体验而诞生的强类型支持工具，提供自然且良好的类型推断体验，可以在大多数情况下省去类型声明，除了 Payload 部分必须使用 PayloadAction 声明。\n\n```typescript\nconst { model, action: { add, addDelay }, initState } = createDvaSlice({\n  namespace: 'count',\n  state: 0,\n  reducers: {\n    add (state, { payload }: PayloadAction\u003cnumber|void\u003e) {\n      return state + (payload || 1)\n    }\n  },\n  effects: {\n    * addDelay ({ payload }: PayloadAction\u003cnumber\u003e, { put, call }) {\n      yield call(delay, 100)\n      yield put({ type: 'add', payload })\n    }\n  }\n})\n\napp.model(model)\napp.start()\napp._store.dispatch(addDelay(2))\nexpect(app._store.getState().count).toEqual(0)\nsetTimeout(() =\u003e {\n  expect(app._store.getState().count).toEqual(2)\n  done()\n}, 200)\n```\n\n## Install\n\n```shell\nnpm i dva-toolkit\n\nyarn add dva-toolkit\n```\n\n## 核心函数\n\n本项目目前只提供 `createDvaSlice` 一个函数，提供类似 `@redux/toolkit` 中 `createSlice` 类似的功能。\n\n`createDvaSlice` 的参数就和 dva 的 model 配置一摸一样，这是为了完美兼容过去的项目，因此过度起来十分简单，对过去的代码没有任何侵入性。`createDvaSlice` 是个支持范型的函数，因此如果希望指定 state 的类型可以直接 `createDvaSlice\u003cIState\u003e({...})`，但该函数返回的 `initState` 可以用作类型推断，所以没有必须声明状态类型的情况。\n\n```typescript\nconst { initState } = createDvaSlice({...})\ntype IState = NonNullable\u003ctypeof initState\u003e\n```\n\n目前 `createDvaSlice` 函数的返回对象只有 `model`、 `action`、`initState` 属性。`model` 是直接注入 dva 中的对象，action 包含所有生成 action 的函数。 initState 属性则是只用来类型推断，永远不会变化的初始状态。\n\n如上面的代码展示的那样，action 包含两个自动生成的函数 `add`, `addDelay`\n\n```typescript\nconst add = (payload: number|void) =\u003e ({payload, type:'count/add'})\n\nconst addDelay = (payload: number) =\u003e ({payload, type:'count/addDelay'})\n```\n\n注意，必须要将 reducer 和 effect 里的 action 定义成 `PayloadAction` 类型，函数的参数才能正确推断，否则无法使用该项目。`PayloadAction` 是遵守 redux 约定，将信息都放在 payload 里的类型。\n\naction 中的函数是用来生成 `{payload: ..., type}` 对象的，你还需要把生成的对象放到 dispatch 中\n\n```typescript\ndispatch(add(1))\n```\n\n## 与 UMI 一起使用\n\numi3 中新加入了验证 dva model 写的对不对的操作，居然是直接用 babel 静态分析。成功让本项目的写法不被理解。需要配置文件里关掉这个设置。未来会贡献 umi dva 的插件让他支持一下。\n\n```js\n  dva: {\n    skipModelValidate: true\n  }\n```\n\n## 开发者的话\n\n2021 年，大家广泛的拥抱 typescript，但是 dva 的维护力度并不强势，如果你想要选择一个状态管理工具，redux + @redux/toolkit、mobx 都是很好的选择。这个项目旨在为 umi 使用者和一些使用 dva 的历史项目提供更好的开发体验，不作为 dva 的宣传力量。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkunduin%2Fdva-toolkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkunduin%2Fdva-toolkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkunduin%2Fdva-toolkit/lists"}