javascript - 具有许多子模块的打字稿项目
问题描述
我有一个项目,我的目标非常简单,将其公开为包含类型定义的库。
实际上,这个项目在没有它的情况下编译并且运行良好,打字稿编译器也可以导出所有定义。
为了理解我的问题,让我介绍该项目的一小部分,以使这里的事情更简单。
项目结构
project root
│ tsconfig.json
│ package.json
│ ...
│
└─── src
│ │
│ │ index.ts
│ └── Elements
│ │ │ Elements.ts
│ │ │ package.json
│ │ │
│ │ └── Button
│ │ │ Button.tsx
│ │ │ package.json
│ │ │
│ │ └── Toast
│ │ │ Toast.tsx
│ │ │ package.json
│ │ │
│ └── Forms
│ │ │ Forms.ts
│ │ │ package.json
│ │ │
│ │ └── InputText
│ │ │ InputText.tsx
│ │ │ package.json
│ │ │
│ │ └── DatePicker
│ │ │ DatePicker.tsx
│ │ │ package.json
通常,package.json
一个类别中的所有文件如下所示:
{
"name": "category-or-component-name",
"version": "0",
"main": "CategoryOrComponent.ts",
"types": "CategoryOrComponent.ts"
}
类别
在 内部src
,有一些组件“类别”,每个类别都包含一个package.json
、一个{CategoryName}.ts
文件和一个组件列表。
一个类别实现,如下所示:
export { default as Button } from './Button'
export { default as Toast } from './Toast'
成分
这里没有太多秘密,每个组件都有其正确的实现,Component.tsx
并且每个组件文件夹中的文件与在类别中创建package.json
的文件几乎相同。package.json
这里是一个组件示例:
import * as React from 'react'
export interface Props {
children?: string | JSX.Element;
}
export default class Button extends React.PureComponent<Props, {}> {
public render (): JSX.Element {
const { children } = this.props
return (
<button>{children}</button>
)
}
}
输出
将源导出为 lib 后,typscript 提供如下类型定义。
project root
│ tsconfig.json
│ package.json
│ ...
│
└─── lib
│ │
│ │ index.d.ts
│ └── Elements
│ │ │ Elements.d.ts
│ │ │
│ │ └── Button
│ │ │ Button.d.ts
│ │ │
│ │ └── Toast
│ │ │ Toast.d.ts
│ │ │
│ └── Forms
│ │ │ Forms.d.ts
│ │ │
│ │ └── InputText
│ │ │ InputText.d.ts
│ │ │
│ │ └── DatePicker
│ │ │ DatePicker.d.ts
定义
永远不会加载类别和组件中的定义,因为.d.ts
文件不指向.d.ts
文件,而是指向文件夹。
让我们看一个定义的例子:
export interface Props {
children?: string | JSX.Element;
}
export default class Button extends React.Component<Props, {}> {
static defaultProps: Partial<Props>;
private handleOnClick;
private handleOnMouseOver;
private handleOnMouseOut;
private handleOnTouchStart;
private handleOnTouchEnd;
render(): JSX.Element;
}
问题
在导入某些资源时生成的任何.d.ts
文件都指向如下文件夹:
import Button from './Elements/Button'
这意味着该库的使用者永远不会找到该Button.d.ts
文件,因为package.json
它里面没有。
工作,src
因为每个文件夹都有一个package.json
文件。这里file的职责package.json
就是向node和typescript指明索引文件是谁,就这么简单。
所以我的问题是,tsc
捆绑中有一些功能或者可能是为了提高模块分辨率?
谢谢
解决方案
推荐阅读
- c# - 无法在剃刀上使用外键对空引用执行运行时绑定
- python - 如何修改patchify制作的补丁?
- angular - Firebase Firestore 的 Map Reduce
- android - Is there a way to disable the "next" button for an editText that is set to numbers?
- webpack - Webpack:使用 SplitChunks 时允许复制特定模块
- python - 使用字符串和整数从输入中获取整数
- flutter - 我有一个问题是将我的颤振应用程序迁移到 null_safety
- python - 恢复丢失的任务 Redis python
- css - Chrome 91 Devtools Inspector 不适用的 CSS 类不再灰显
- sql - PARTITION BY 只考虑两个特定的列进行聚合?