Typescript-导入模块(如果存在)

Typescript-导入模块(如果存在),typescript,Typescript,如果模块存在,如何导入该模块? 我有两个项目,客户端和服务器。两者都导入同一个文件。 该文件导入仅安装在服务器项目中的节点模块。客户端没有模块。 因此,从服务器项目打开时,require必须返回键入的模块。 从客户端项目打开时,它必须返回未定义的 下面是客户项目的屏幕截图。Typescript没有编译,因为它说找不到模块。 简单的require不保留以下类型: 这有两个部分: 正式的进口声明必须是无条件的导入表示模块必须始终存在。这并不意味着它必须是你真正需要的模块 所需类型是服务器端的mod

如果模块存在,如何导入该模块?

我有两个项目,客户端和服务器。两者都导入同一个文件。
该文件导入仅安装在服务器项目中的节点模块。客户端没有模块。
因此,从服务器项目打开时,require必须返回键入的模块。
从客户端项目打开时,它必须返回
未定义的

下面是客户项目的屏幕截图。Typescript没有编译,因为它说找不到模块。

简单的
require
不保留以下类型:

这有两个部分:

  • 正式的进口声明必须是无条件的<代码>导入
  • 表示模块必须始终存在。这并不意味着它必须是你真正需要的模块
  • 所需类型是服务器端的
    module | undefined
    。但是在客户端,
    模块
    是不可知的。因此,为了允许基于服务器的调用,我们应该允许使用任何字段,比如
    {[k:string]:any}
    ,并且我们需要能够选择哪一个字段适合我们所在的那一方
  • 因此,您最好的选择可能是向客户端添加一个同名的空模块,即在客户端的
    node\u modules
    文件夹中添加一个名为
    type graphql.ts
    的文件,该文件仅包含:

    export {}
    
    这样,无条件导入将始终有效,客户端将导入此空模块文件,服务器将导入实际的库。然后,您只需要重新分配变量以考虑可能的接口:

    import * as _TypeGraphQL from 'type-graphql';
    
    // don't check methods on the client side, if we had type definitions on both we could just use that
    type CLIENT_SIDE_INTERFACE = {[k:string]:any};
    // on server side we can check for case that the module is not present.
    type SERVER_SIDE_INTERFACE = typeof _TypeGraphQL | {"ISDUMMY":true}
    
    // if the imported module has our indicator key then we are on the client side
    type THIS_SIDE_INTERFACE = "ISDUMMY" extends (keyof typeof _TypeGraphQL) ? CLIENT_SIDE_INTERFACE : SERVER_SIDE_INTERFACE
    
    const TypeGraphQL: THIS_SIDE_INTERFACE = _TypeGraphQL;
    

    在指出将文件放入普通
    节点_modules
    文件夹是一个很好的选择之后,我还可以提供一个可能的解决方案

    Node解析模块(不是以
    /
    /
    开头)的方法是从当前文件向上遍历文件夹树,每一级查看是否有名为
    Node\u modules
    的文件夹。通常这意味着在项目的根目录中有一个包含所有模块的文件夹。但是,您可以在项目中间添加另一个文件夹,称为“代码> NoDEYMeases/COD>”,并且通过文件导入的任何文件都将首先搜索该文件夹。

    因此,对于这样的文件夹结构,您可以将虚拟文件以某种方式放入项目中,
    import*作为“test graphql”
    将从稳定的文件夹导入:

    root
    - node_modules
    - src
      --- SUBFOLDERS
            - node_modules
              -test-graphql.tsx (dummy code)
            - git-sub-module
              - wrapper.tsx (containing the import code mentioned above)
    
    在这种情况下,wrapper.tsx中的代码将尝试从内部节点导入空模块文件。
    只需确保在空模块中添加足够的注释来解释巫术正在进行的操作:)

    谢谢您的解释。我现在明白了,要导入模块并保留类型,模块目标必须存在,不管它是什么。但是,当导入状态为“type graphql”
    时,如何能够导入
    ISDUMMY
    模块?它将在
    节点\u模块中搜索“type graphql”。如何使其从
    ISDUMMY
    模块导入?将名为
    type graphql.tsx
    的文件放入客户端的
    node\u modules
    文件夹中。编辑答案以澄清问题。在
    节点_模块
    中添加文件不是一个稳定的解决方案。如果更新/重新安装了依赖项,则模块将被删除。此外,虚拟模块不会在git中提交,因此我们必须为git repo克隆的每个依赖项重新创建一个虚拟模块。通常情况下,不应依赖于在
    node_module
    文件夹中所做的编辑。根据导入分辨率,您可以将其放入顶层文件夹(在
    src
    文件夹旁边),或者我见过一些将src放在解析路径上的导入设置,因此如果是这种情况,将其放在src中也会起作用。如果您的客户端和服务器位于同一个git repo中,则会使事情变得复杂。。。让我想想……别担心。客户端和服务器具有不同的repo。它们共享一个包含共享类的git子模块。谢谢但我仍然不明白如何使导入从
    类型graphql
    指向项目文件。要导入项目文件,导入目标必须以
    /
    或类似
    /path/To/module
    开头。只需
    键入graphql
    即可使导入直接查看节点模块。