Как правильно экспортировать / импортировать модули Typescript? - PullRequest
0 голосов
/ 25 января 2019

Первый раз пишу пакет Typescript (NPM / приватный пакет), но большой опыт работы с самим Typescript.

Скажите, что моя посылка называется "my-api". Он экспортирует классы для выполнения вызовов API, а также модели, используемые / возвращаемые этими вызовами API.


структура

models/
  User.ts
  index.ts
services/
  BaseService.ts
  UserService.ts
  index.ts
index.ts

Модели / User.ts

export type User = { ... }

Модели / index.ts

export { User } from "./User.ts";

услуги / BaseService.ts

export abstract class BaseService { ... }

услуги / UserService.ts

export class UserService extends BaseService { ... }

услуги / index.ts

export { UserService } from "./UserService.ts";

index.ts

export * from "./models";
export * from "./services";

Объявление

Моя декларация выглядит так (сокращенно):

declare module "models/User" {
    export type User = { ... };
}

declare module "services/BaseService" {
    export abstract class BaseService { ... }
}

declare module "services/UserService" {
    import { BaseService } from "services/BaseService";
    export class UserService extends BaseService { ... }
}

Обратите внимание, что не существует охватывающего my-api модуля и т. Д., Эти объявления находятся в корне.

ожидаемое использование

В моем приложении, которое включает my-api через NPM, я хочу использовать эти классы и типы:

CreateUserForm.ts

import { User, UserService } from "my-api";

 // OR

import { User } from "my-api/models";
import { UserService } from "my-api/services";

export class CreateUserForm { ... }

но это не работает

При создании моего внешнего проекта Typescript жалуется:

Файл '/home/.../my-project/ui/node_modules/my-api/my-api.d.ts' не является модулем.

Я не знаю, как убедить Typescript создать соответствующее определение.

Приложение

Объявления генерируются с помощью этой команды:

./node_modules/.bin/tsc --project ./tsconfig-definition.json --outFile ./dist/my-api.d.ts

TSconfig-definition.json

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "declaration": true,
    "emitDeclarationOnly": true,
    "noEmit": false,
    "resolveJsonModule": false
  },
  "include": [ "./src" ]
}

tsconfig.json

{
  "compilerOptions": {
    "lib": ["dom", "es2015", "es2016"],
    "jsx": "preserve",
    "target": "es5",
    "module": "esnext",
    "moduleResolution": "node",
    "declaration": false,
    "noImplicitAny": false,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "removeComments": false,
    "preserveConstEnums": true,
    "sourceMap": true,
    "skipLibCheck": true,
    "allowJs": false,
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "isolatedModules": false,
    "strictNullChecks": false,
    "noEmit": true,
    "allowSyntheticDefaultImports": true,
    "types": ["node"]
  },
  "include": ["src"]
}

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