我有一个项目,我的目标非常简单,将其公开为包含类型定义的库。
实际上,这个项目在没有它的情况下编译并运行良好,打字稿编译器也会导出所有定义。
为了理解我的问题,让我介绍一下该项目的一小部分,以使事情变得更加简单。
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'
这意味着该lib的使用者永远不会找到Button.d.ts
文件,因为其中没有package.json
。
在src
工作,因为每个文件夹都有一个package.json
文件。这里package.json
文件的责任是指示节点和打字稿,谁是索引文件,就像这样。
所以我的问题是,tsc
中有一些功能可以捆绑或改进模块解析?
由于