gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:36:35 24 4
gpt4 key购买 nike

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

我有 2 个项目,客户端和服务器。两者都导入一个相同的文件。
该文件导入仅安装在服务器项目中的节点模块。客户端没有模块。
所以 require 必须返回模块 输入 从服务器项目打开时。
它必须返回 undefined从客户端项目打开时。

下面是客户端项目的屏幕截图。 Typescript 无法编译,因为它说它找不到模块。
Typescript require cannot find module type-graphql

一个简单的require不保留类型:
enter image description here

最佳答案

这有两个部分:

  • 正式的导入声明必须是无条件的。 import意味着模块必须始终存在。这并不意味着它必须是您实际需要的模块。
  • 所需类型为 module | undefined在服务器端。但是在客户端module是不可知的。因此,为了允许基于服务器的调用,我们应该允许使用任何字段,例如 {[k:string]:any} ,我们需要能够选择哪一个适合我们所在的一侧。

  • 所以你最好的选择可能是在你的客户端添加一个同名的空模块,所以一个名为 type-graphql.ts 的文件在 node_modules客户端上的文件夹仅包含:
    export {}

    这样无条件导入将始终有效,客户端将导入此空模块文件,服务器将导入实际库。然后你只需要重新分配变量来考虑可能的接口(interface):
    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;

    之后指出将文件放入 正常 node_modules文件夹是 problematic ,我也可以为此提供一个可能的解决方案。

    节点通过从当前文件向上遍历文件夹树来解析模块(不以 .// 开头),每个级别查看是否有一个名为 node_modules 的文件夹.通常这意味着在您的项目的根目录中有一个包含所有模块的文件夹。但是,您可以在项目中间添加另一个名为 node_modules 的文件夹。并且任何按文件导入的文件都将首先搜索该文件夹。

    因此,对于这样的文件夹结构,您可以将虚拟文件以 import * as a from '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 中的代码在这种情况下会尝试从内部 node_modules 导入导入空模块文件。
    只要确保您在空模块中添加足够的注释来解释正在发生什么巫术:)

    关于Typescript - 导入模块(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59293188/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com