小编sam*_*256的帖子

在 TypeScript 中设置所需的函数参数

在下面的代码中:

\n
type NoArg = {\n  (): void\n}\n\ntype OneArg = {\n  (x:number): void\n}\n\nlet noArg: NoArg = (x:number)=>{}\nlet oneArg: OneArg = ()=>{}\n
Run Code Online (Sandbox Code Playgroud)\n

只有第一个赋值才会产生编译器错误。我理解为什么会出现这种情况,因为 JavaScript 允许传递函数时使用少于其完整的可能参数集,并且 \xe2\x80\x99s 不同于说参数是可选的,这与函数的调用方式有关而不是它\xe2\x80\x99s 是如何通过的。请参阅常见问题解答

\n

但话虽如此,有没有办法构造一个与零参数函数不兼容的 OneArg 接口版本?

\n

我知道这可以通过品牌或名义打字来完成,例如,

\n
type OneArg = {\n  (x:number): void\n  _brand: \xe2\x80\x9cOneArg\xe2\x80\x9d\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,或者任何其他类型的名义类型解决方案,都需要在赋值时进行额外的工作(例如,您必须显式地将 _brand 属性添加到函数中)。

\n

所以我的问题是\xe2\x80\x94是否有任何方法可以构造一个类型NoArg,该类型会使简单赋值失败let oneArg: OneArg = ()=>{}

\n

上面链接的常见问题解答说 \xe2\x80\x9cTypeScript 目前没有办法指示必须存在回调参数。\xe2\x80\x9c 这是否完全排除了我想要在这里执行的操作?我\xe2\x80\x99m 希望它不会\xe2\x80\x99t,因为这是\xe2\x80\x99t 回调参数,但也许原理是相同的。

\n

更新:在下面的评论中,提出了是否可以通过类型保护测试来实现这一点的问题。据我所知,答案是否定的,因为类型重叠意味着类型保护不会缩小类型。你可以在这个操场上看到它。

\n

typescript

6
推荐指数
1
解决办法
4712
查看次数

模块化 Redux Toolkit 应用程序

问题

是否可以将依赖于 redux 存储不同部分的基于 RTK 的应用程序的功能分离到单独的节点包中?假设是这样,最好的方法是什么?

背景

我们有一个基于 Redux Toolkit 的大型且不断增长的应用程序。在可能的情况下,我们尝试将应用程序的各个部分分离到它们自己的节点包中。我们发现这样做有很多好处,包括:

  • 代码库的可维护性
  • 对应用程序内依赖关系的细粒度控制
  • 可测试性

对于横切事物(例如日志记录、http 请求、路由等)来说,这样做很容易。但我们想更进一步,模块化我们应用程序的“功能”。例如,让我们的应用程序的“地址簿”功能与“消息”功能位于不同的模块中,它们都通过“app”包组合在一起。

我们在这里看到的好处是我们在其他代码库中发现的,并且已经在其他地方讨论过。(例如,此处适用于 iOS)。但是,简而言之:(1) 您可以查看和控制应用程序内的依赖关系。例如,您可以轻松查看“消息”功能是否依赖于“地址簿”功能,并明确决定如何通过导出内容将一个功能公开给另一个功能;(2) 您可以通过简单地拥有一个仅包含您想要测试的内容的“预览”包来构建应用程序的完全可测试的子部分,例如,您可以拥有一个仅依赖于“用于构建和测试该功能的“接触”功能;(3) 不需要编译(TS/babel)、打包/压缩和单元测试每个部分,从而加快 CI/CD 时间;(4) 您可以利用各种分析工具来更详细地了解每个功能的开发情况。

很可能还有其他方法来实现这些目标,有些人可能不同意这是一个好方法的前提。这不是问题的重点,但我愿意接受这可能是最好的答案的可能性(例如,一些具有丰富 Redux 经验的人可能会解释为什么这是一个坏主意)。

问题

我们一直在努力想出一种使用 Redux Toolkit 来做到这一点的好方法。问题似乎可以归结为——是否有一个好的方法来模块化(通过单独的节点包)RTK 中使用的各种“切片”?(这可能适用于其他 Redux 实现,但我们在 RTK 上投入了大量资金)。

拥有一个导出 Redux 存储将使用的各种项目的包是很容易的,即切片状态、动作创建者、异步 thunk 和选择器。然后 RTK 将在更高级别的应用程序中很好地组合这些内容。换句话说,您可以轻松地拥有一个包含商店的“app”包,然后是一个导出“contacts”切片及其伴随操作、thunk、选择器等的“contacts”包。

如果您还希望使用切片的该部分的组件和挂钩与切片位于同一包中(例如,在“contacts”包中),则会出现问题。这些组件/钩子需要访问全局调度和全局 useSelector钩子才能真正工作,但这仅存在于“app”组件中,即组合各种功能包的功能。

考虑的可能性

  1. 我们可以从“更高”级别的“app”包中导出全局调度和 useSelector,但是我们的子组件现在依赖于更高级别的包。这意味着我们不能再构建由子包的不同排列组成的替代更高级别的包。

  2. 我们可以使用单独的商店。过去关于 Redux已经讨论过这一点,并且不鼓励这样做,尽管有一些建议,如果您试图实现模块化,这可能是可以的。这些讨论也有些陈旧了。

问题(再次)

是否可以将依赖于 redux 存储不同部分的基于 RTK 的应用程序的功能分离到单独的节点包中?假设是这样,最好的方法是什么?

虽然我主要感兴趣的是是否/如何在 RTK 中实现这一点,但我也对答案感兴趣——尤其是那些在大型应用程序上具有 RTK/redux 经验的人——关于这是否是坏主意以及什么采取其他方法来实现模块化的好处。

redux react-redux

5
推荐指数
1
解决办法
1262
查看次数

标签 统计

react-redux ×1

redux ×1

typescript ×1