尽管 package.json 中设置了“main”属性,但 Typescript module解析失败

IT技术 reactjs typescript module
2021-05-09 14:19:41

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

import MyComponent from './MyComponent';

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

找不到module“./MyComponent”`

文件夹结构:

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

我的组件.tsx:

export default class extends Component {
  ...
}

包.json:

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

如果我更改MyComponent.tsxindex.tsx,它会起作用,但我认为mainin的目的package.json是做我正在尝试的事情。谢谢!

1个回答

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

这背后的原因是这些字段旨在与已发布的包一起使用。.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文件,你可以让它们重新导出module:

export * from '/MyComponent';

编辑:包括实际解决方案...