在 Typescript 中扩展超级测试
Extending supertest in Typescript
我正在尝试在 supertest 上创建一个扩展。
使用我在问题中发现的内容 Extending SuperTest。我在 javascript
:
上有这个工作示例
const request = require('supertest');
const Test = request.Test;
Test.prototype.authenticate = function(user) {
const {token, xsrfToken} = user.tokens;
return this
.set('Authorization', `Bearer ${token}`)
.set('X-XSRF-TOKEN', xsrfToken);
}
在测试块中我可以使用:
request(app)
.post('/user/settings')
.authenticate(user)
.send(...)
这很好用。现在的问题是在 *.test.ts
文件中使用扩展名。
如 , I try to create a file to use the typescript feature Declaration Merging 中所建议。
// file location: ./src/types/supertest
declare namespace supertest {
export interface Test {
authenticate(user: any): this; // I didn't put a type on user to simplify here.
}
}
也改变了我的tsconfig.json
{
"compilerOptions": {
...
"typeRoots": ["./src/types"],
...
}
}
但是当我运行npx tsc
$ npx tsc
src/api/user.test.ts:51:8 - error TS2551: Property 'authenticate' does not exist on type 'Test'.
51 .authenticate(user);
~~~~~~~
问题
有没有办法在打字稿环境中解决这个问题?
[编辑]
额外信息(不一定有用):
在同一个项目中,我对 express
、chai
和 pdf-merge-js
进行了扩展。使用上述方法,它们都可以正常工作。
supertest
可能 @types/supertest
有一些特殊之处阻止它工作。
这是我项目中的一些代码,已经可以用于 express:
// file location: ./src/types/express
import { ModelBase } from '../../models/base';
declare global {
namespace Express {
export interface Response {
model: (model: ModelBase) => this;
}
}
}
我不确定为什么,但这对我有用:
declare module "supertest" {
interface Test extends superagent.SuperAgentRequest {
authenticate(user: any): this;
}
}
结构:
index.ts
tsconfig.json
types
- supertest
- index.d.ts
我的index.ts
:
import request from "supertest";
import express from "express";
const app = express();
app.get("/user", function (req, res) {
res.status(200).json({ name: "john" });
});
request(app)
.post("/user/settings")
.authenticate({ tokens: { token: "", xsrfToken: "" } })
.send();
我的tsconfig.json
:
{
"compilerOptions": {
"outDir": "dist",
"rootDir": ".",
"typeRoots": ["./types", "./node_modules/@types"],
"esModuleInterop": true
},
"files": ["./types/supertest/index.d.ts", "index.ts"]
}
我的types/supertest/index.d.ts
:
import superagent from "superagent";
declare module "supertest" {
interface Test extends superagent.SuperAgentRequest {
authenticate(user: any): this;
}
}
我认为declare module "supertest"
是关键部分。您做对的其他所有内容。
我遇到了这个问题,我解决了它只是导入测试文件
import { agent as request } from "supertest";
这个对我很有效。
首先我导入了类型
npm i -D @types/supertest
然后我用了
import { agent as request } from "supertest";
我正在尝试在 supertest 上创建一个扩展。
使用我在问题中发现的内容 Extending SuperTest。我在 javascript
:
const request = require('supertest');
const Test = request.Test;
Test.prototype.authenticate = function(user) {
const {token, xsrfToken} = user.tokens;
return this
.set('Authorization', `Bearer ${token}`)
.set('X-XSRF-TOKEN', xsrfToken);
}
在测试块中我可以使用:
request(app)
.post('/user/settings')
.authenticate(user)
.send(...)
这很好用。现在的问题是在 *.test.ts
文件中使用扩展名。
如
// file location: ./src/types/supertest
declare namespace supertest {
export interface Test {
authenticate(user: any): this; // I didn't put a type on user to simplify here.
}
}
也改变了我的tsconfig.json
{
"compilerOptions": {
...
"typeRoots": ["./src/types"],
...
}
}
但是当我运行npx tsc
$ npx tsc
src/api/user.test.ts:51:8 - error TS2551: Property 'authenticate' does not exist on type 'Test'.
51 .authenticate(user);
~~~~~~~
问题
有没有办法在打字稿环境中解决这个问题?
[编辑]
额外信息(不一定有用):
在同一个项目中,我对 express
、chai
和 pdf-merge-js
进行了扩展。使用上述方法,它们都可以正常工作。
supertest
可能 @types/supertest
有一些特殊之处阻止它工作。
这是我项目中的一些代码,已经可以用于 express:
// file location: ./src/types/express
import { ModelBase } from '../../models/base';
declare global {
namespace Express {
export interface Response {
model: (model: ModelBase) => this;
}
}
}
我不确定为什么,但这对我有用:
declare module "supertest" {
interface Test extends superagent.SuperAgentRequest {
authenticate(user: any): this;
}
}
结构:
index.ts
tsconfig.json
types
- supertest
- index.d.ts
我的index.ts
:
import request from "supertest";
import express from "express";
const app = express();
app.get("/user", function (req, res) {
res.status(200).json({ name: "john" });
});
request(app)
.post("/user/settings")
.authenticate({ tokens: { token: "", xsrfToken: "" } })
.send();
我的tsconfig.json
:
{
"compilerOptions": {
"outDir": "dist",
"rootDir": ".",
"typeRoots": ["./types", "./node_modules/@types"],
"esModuleInterop": true
},
"files": ["./types/supertest/index.d.ts", "index.ts"]
}
我的types/supertest/index.d.ts
:
import superagent from "superagent";
declare module "supertest" {
interface Test extends superagent.SuperAgentRequest {
authenticate(user: any): this;
}
}
我认为declare module "supertest"
是关键部分。您做对的其他所有内容。
我遇到了这个问题,我解决了它只是导入测试文件
import { agent as request } from "supertest";
这个对我很有效。
首先我导入了类型
npm i -D @types/supertest
然后我用了
import { agent as request } from "supertest";