【发布时间】:2019-06-18 19:48:46
【问题描述】:
我想创建一个 TypeScript 库作为可以在 Node.js 中使用的私有 npm 包(包括使用支持 @types 的 ES6 和 TypeScript 的 6.x)。
该库的目标是从express 扩展Request 类型并提供额外的属性。
我创建了一个新的 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
我在src/http 中创建了一个新的TypeScript 文件AuthenticatedRequest.ts:
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声明/** @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文件夹名称?
另外,在集成测试项目中使用AuthenticatedRequest 的jsdoc 注释,我得到找不到类型的错误:
【问题讨论】:
-
您可以创建
src/index.ts并从该文件中导出所有内容(例如export * from './security/Claim')。然后从您的 JS 代码中只需要@scope/my-lib。至于const Claim = require(...).Claim,使用解构:const {Claim} = require(...)。如果您不确定导出的内容,可以console.log(require(...))。
标签: node.js typescript jsdoc