У меня есть проект, цель которого очень проста, представить его как библиотеку с включенными типизированными определениями.
На самом деле этот проект компилируется и работает без него, компилятор машинописи также экспортирует все определения.
Чтобы понять мой вопрос, позвольте мне представить небольшую часть этого проекта, чтобы упростить его здесь.
Структура проекта
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
есть некоторая особенность для объединения или, возможно, дляулучшить разрешение модуля?
Спасибо