当前位置: 首页 > 面试题库 >

尽管在package.json中设置了“ main”属性,打字稿模块解析仍失败

傅经业
2023-03-14
问题内容

在下面的文件夹结构中,我想以App.tsx这种方式导入我的组件:

import MyComponent from './MyComponent';

尽管我的package.json文件main设置了属性,但Typescript会引发错误:

找不到模块“ ./MyComponent”`

资料夹结构:

src/
|- App.tsx
|- MyComponent/
|    |- MyComponent.tsx
|    |- package.json
|    |- ...

MyComponent.tsx:

export default class extends Component {
  ...
}

package.json:

{
  "name": "my-component",
  "version": "0.0.0",  
  "main": "MyComponent.tsx"
}

如果我更改MyComponent.tsxindex.tsx,则可以使用,但是我认为mainin
的目的package.json是完全按照我的意图进行。谢谢!


问题答案:

main字段仅支持带有.js扩展名的解析模块,并且该types字段(与TypeScript类似main)支持.d.ts字段。该打字稿模块分辨率文档只描述了这些扩展用途。

其背后的原因是,这些是供发布的软件包使用的字段。.ts(或.tsx您的情况)文件是旨在转换为可用于生产环境的JavaScript的开发文件(以及辅助元数据文件)。如果已发布的包,甚至包括.ts文件(而不是他们造成.d.ts.js.js.map输出),试图要求这些文件将是非常不可取的。

执行之前,您的TypeScript始终会转换为JS。编译器对TypeScript文件的简化包含的支持假定运行时之前还对这些包含进行了转译。

只要将您tsconfig.json配置为输出声明(和源映射)文件:

"compilerOptions": {
    "declaration": true,
    "sourceMap": true,
    ...

您可以将maintypes字段指向输出文件:

"main": "myComponent.js",
"types: "myComponent.d.ts",

创建这些文件后,它们将正确解析。请注意,这意味着如果您使用任何编码帮助,通常意味着您必须重新编译才能获取更新的提示。

如果您需要自动代码协助,则index.tsx可能是更好的方法。如果您确实想避免连续编辑多个index.tsx文件,则可以让它们重新导出模块:

export * from '/MyComponent';

编辑:包括实际的解决方案…



 类似资料:
  • 问题内容: 我正在尝试将IBM的CPLEX库与我的Java应用程序集成。现在,我只是试图创建一个IloCplex对象。我添加了Cplex.jar,它可以很好地编译,但是当我运行它时: Cplex在抛出异常之前打印此消息: 我通过这个参数给JVM: 。这是cplex124.dll的位置。我看过的每个教程都给出了相同的步骤,我觉得自己很好地遵循了它们。 我究竟做错了什么?? 问题答案: 我在互连网上发

  • 我希望存储在redis缓存中的数据在给定的时间段后自动从缓存中清除,而无需对其调用delete方法。在这个POC中,我将TTL设置为60秒。我曾尝试在缓存管理器中使用API SetDefaultExpire、setExpires设置它,并在RedisTemplate中使用API expire设置它。到目前为止,没有一个解决方案对我有效。 在使用的redis存储库中, 请给我指出正确的方向。感谢您的

  • 我想知道最好的方法,比如我有两个物体 如果objectC由创建 我如何声明/描述objectC,以便编译器/IDE知道它同时具有objectA和objectB的属性? 我想找到一种不需要为objectA和objectB定义接口的方法。我不想为同一个属性写两次声明和定义/求值。如果我在一个对象上有太多的属性,这种冗余是很重要的。 (是否有一个运算符可以提取现有对象的接口/类型?) 可能吗?

  • 问题内容: 我不明白为什么找不到它。 导入组件文件。 是什么赋予了? 问题答案: 如果您不使用打字稿2.1,则应升级到它。似乎您使用的是@types中的2.x版本。 这是我现在正在使用的工作文件: 自从我解决了您遇到的同样问题以来已经过了几天,但我认为这里的关键是and 。

  • 问题内容: 我正在尝试打字稿。在hello世界阶段它工作正常。我现在正在尝试使用npm模块: = 这不起作用: -> -> 看着打字稿文档和谷歌没有帮助。其他S /O问题未得到回答 元素: 打字稿1.8最新 是的,lodash已安装并存在于我的文件系统中(已选中) 我也做了 变种或不起作用 我试图调整tsconfig.json选择在其他的答案建议 ,并在一些答案建议,仍然无法正常工作 我们如何在打

  • 这是我在这里的第一个问题,所以如果我做错了什么,我提前道歉。 如你所知,不和谐最近实施了一些改变,这使得有必要激活特权网关意图,这样机器人就可以继续欢迎新成员并给他们角色。 我的机器人在一个服务器中,所以我同时授予它PRESENCE INTENT和SERVER MEMBERS INTENT。我的印象是,这应该足以让机器人重新开始正常工作,但可悲的是,它仍然不欢迎新成员,也没有给它自定义角色。其他一

  • 我有一个多模块Spring引导梯度项目。我在每个模块yml文件中都有指向数据库的属性:user、pass、URL。 这是一个可行的解决方案,但很难改变项目数据库。每次我想切换数据库用户或url,我必须改变10+yml文件。 如何避免这一点?

  • 当取消序列化一个对象时,您可以使用JSON. parse中的恢复函数,就像在示例中一样。但是,您正在通过常量字符串中的名称访问对象的属性,从而失去了类型脚本的“控制”(例如,重构更改道具的名称不会反映在开关案例中)。 有没有更好的方法来使用typecript的可能性?