Я хочу создать библиотеку TypeScript в качестве частного пакета npm, который можно использовать в Node.js (включая 6.x)
с использованием ES6 с поддержкой @types
и TypeScript.
Цель библиотеки -расширить тип Request
с express
и предоставить дополнительные свойства.
Я создал новый проект Node.js и добавил его tsconfig.json
:
{
"compilerOptions": {
"target": "es2015",
"module": "commonjs",
"sourceMap": true,
"declaration": true,
"outDir": "./dist",
"strict": true,
"types": ["mocha"]
}
}
Это соответствующие частиpackage.json
:
{
"name": "@myscope/my-lib",
"main": "dist",
"scripts": {
"build": "rm -rf ./dist && ./node_modules/.bin/tsc",
"test": "./node_modules/.bin/mocha test"
},
"private": true,
"dependencies": {
"joi": "11.4.0"
},
"devDependencies": {
"mocha": "^5.2.0",
"express": "^4.16.4",
"@types/express": "^4.16.1",
"@types/joi": "^14.3.0",
"@types/mocha": "^5.2.5",
"typescript": "^3.2.4"
}
}
Моя структура папок такая:
- dist
- src
- http
- security
- test
Я создал новый файл TypeScript AuthenticatedRequest.ts
в src/http
:
import {Request} from "express";
import {UserReference} from "../security/UserReference";
export interface AuthenticatedRequest extends Request {
user: UserReference
}
src/security
содержит UserReference.ts
:
import {Claim} from "./Claim";
export interface UserReference {
claims: Claim[];
}
и Claim.ts
:
import {IClaim} from "./IClaim";
export class Claim implements IClaim {
type: string;
value: string;
constructor(type: string, value: string) {
this.type = type;
this.value = value;
}
}
IClaim.ts
выглядит следующим образом:
export interface IClaim {
type: string,
value: string
}
В test
я создал AuthenticatedRequestTests.js
(обычный ES6, здесь нет TypeScript для завершения кода проверки и использования из ES6):
'use strict';
const assert = require('assert');
const Claim = require("../dist/security/Claim").Claim;
describe('req', () => {
it('should ', done => {
/** @type {AuthenticatedRequest} */
const req = {};
req.user = { claims: [new Claim('tenantId', '123')] };
assert.equal(req.user.claims[ 0 ].type, 'tenantId');
assert.equal(req.user.claims[ 0 ].value, '123');
return done();
});
});
Теперь у меня есть несколько вопросов:
- Это ожидаемый способ TypeScript для решения этой проблемы?
- Можно ли просто использовать
require("../dist/security/Claim");
вместо require("../dist/security/Claim").Claim;
? - вместо использования этого
jsdoc
государственных деятелейt /** @type {AuthenticatedRequest} */
Я хотел бы использовать /** @type {myLib.http.AuthenticatedRequest} */
Я также создал локальный тестовый проект для интеграции и установил свою библиотеку через npm link
.
Но вместо использования
const Claim = require("@scope/my-lib/security/Claim").Claim;
Мне нужно использовать
const Claim = require("@scope/my-lib/dist/security/Claim").Claim;
Как мне избавиться от имени папки dist
здесь?
Также, используяjsdoc
комментарий для AuthenticatedRequest
в проекте тестирования интеграции, я получаю ошибку, что тип не может быть найден: