Проект машинописного текста со множеством подмодулей - PullRequest
0 голосов
/ 11 июня 2018

У меня есть проект, цель которого очень проста, представить его как библиотеку с включенными типизированными определениями.

На самом деле этот проект компилируется и работает без него, компилятор машинописи также экспортирует все определения.

Чтобы понять мой вопрос, позвольте мне представить небольшую часть этого проекта, чтобы упростить его здесь.

Структура проекта

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>
    )
  }
}

Выходные данные

После экспорта источника в виде библиотеки, 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.Ответственность файла package.json здесь заключается в том, чтобы указать узлу и машинописи, кто является индексным файлом, просто так.

Так что мой вопрос, в tsc есть некоторая особенность для объединения или, возможно, дляулучшить разрешение модуля?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...