具有许多子模块的打字稿项目

时间:2018-06-11 04:36:44

标签: javascript typescript webpack ecmascript-6

我有一个项目,我的目标非常简单,将其公开为包含类型定义的库。

实际上,这个项目在没有它的情况下编译并运行良好,打字稿编译器也会导出所有定义。

为了理解我的问题,让我介绍一下该项目的一小部分,以使事情变得更加简单。

项目结构

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中有一些功能可以捆绑或改进模块解析?

由于

0 个答案:

没有答案