Первый раз пишу пакет 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"]
}