【问题标题】:Custom types across multiple .ts/.tsx files跨多个 .ts/.tsx 文件的自定义类型
【发布时间】:2020-10-09 17:27:43
【问题描述】:

我正在尝试使用 Typescript(和 React/Redux)构建我的第一个项目,并努力在多个文件之间传递我的自定义类型:比如让我的动作类型可供动作创建者、reducer 和每个组件调度一些那些动作。

那么,这里的正确方法是什么:

  • 在一个通用文件中声明所有自定义类型并在必要时导入?
  • 在其相关文件中声明自定义类型并制作导入/导出网络?
  • 我还没有想到的其他选项?

我知道这个问题可能会因为固执己见而被关闭,但我在 typescriptlang.org 和其他资源(包括 SO 主题)中都找不到答案。

【问题讨论】:

  • 我总是选择#2,但我也愿意接受其他一些好的观点。
  • #2 具有使文件之间的依赖关系显式化的额外好处。请注意,您现在已经拥有“导入/导出网络”,但它是隐含的,阅读代码的人并没有意识到它 - 使得理解和重构更加困难。
  • 我更喜欢#1,我认为每件事都有它的位置,它甚至更好,因为有时你需要一些非常复杂的打字,而且看你的组件的人不需要知道它是如何工作的,他们只是需要使用它。在另一个文件中使用也很有帮助,因为允许解释器不解释所有内容,从而更快地产生智能感知和输入错误。当然,这仅适用于组件或模块的范围类型,更“全局”的东西应该放在特定文件夹中,例如 typesinterfacesenums
  • 我更喜欢#1,好像我需要寻找我的类型或进行更改,我知道该去哪里。我只是从该模块导入我需要的类型。可能还值得一提的是,Typescript 项目本身使用单个 types.ts 文件。如果您经常重复使用类型,将它们保存在一个公共文件中是有意义的。

标签: javascript reactjs typescript redux react-redux


【解决方案1】:

我通常根据它们是更具全局性还是局部性来划分我的类型。例如,如果我有一些仅在单个模块或文件中使用的类型,我会倾向于将这些类型存储在与实现相同的位置:

/components
  /Search
    /Search.tsx
    /search.types.ts <- contains component types like props
    /SearchContainer.tsx

对于更多的全局类型,我有一个单独的 /types 文件夹,通常在我拆分为单独命名空间的根级别。

/types
  /search
  /authentication
  /actions
  /routing

您在此types 目录中存储的内容将特定于您的应用程序,但您会得到大致的概念。您还可以使用别名来导入类型,这样您就不必处理多个级别的相对导入:../../../types/something => @types/something

【讨论】:

  • 别名是个好主意,但对于构​​建可分发库的人来说不是一个选择
  • 我猜它一定是混合的。谢谢你的线索。
  • 这似乎是一个单独的问题,但是,我希望您能提供一点提示:alias trick 是否应该以某种方式实现 like that?跨度>
  • @ZChu 这绝对取决于您的构建设置和您的特定需求,但是是的,这是实现别名的好方法
【解决方案2】:

将所有类型放入一个模块并调用filename.d.ts

//filename.d.ts

  declare module "my-module"{
    
      export type int = number;
    
    
    {

如果您想使用枚举,请将其放在 .ts 文件中(而不是 d.ts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多