我们converting是一个从JavaScript到TypeScript的Node.js模块。在初始转换中,有some code在应为string
时错误地将类型定义为any
。 (已传递给express的接受any
的res.send()。)
这是代码的相关子集:
namespace RateLimit {
export interface Options {
message: string; // <-- should be any
}
}
function RateLimit(incomingOptions: Partial<RateLimit.Options>): RateLimit {
// ...
}
export = RateLimit;
其他用户在此处尝试使用非字符串时遇到reported错误:
node_modules/express-rate-limit/dist/express-rate-limit.d.ts:13:9
13 message: string;
~~~~~~~
The expected type comes from property 'message' which is declared here on type 'Partial<Options>'
at createTSError (/Users/xxx/IdeaProjects/xxx/node_modules/ts-node/src/index.ts:245:12)
...
此修复程序看起来很简单,但是在修复该漏洞之前,我为该错误创建了摩卡test:
require("ts-node/register");
const rateLimit = require("../lib/express-rate-limit.ts");
describe("express-rate-limit typescript typings", function() {
it("should work with non-string messages", () => {
rateLimit({
message: { json: "object" }
});
rateLimit({
message: Buffer.from("I'm a buffer!")
});
});
});
但是,测试通过了!我以为可能与摩卡咖啡有关,所以我尝试跑步
npx tsc test/typings-test.ts
但是,这也没有错误。
我还尝试require()
编译已编译的js而不是包含ts源和ts节点,但是这种变化也通过了。
那么,我想念什么?为什么打字稿不对这些不匹配的类型抛出错误?
答案 0 :(得分:1)
@artem给了我90%的工作所需。有两个问题:
1)必须先ts-node/register
,然后才能解析测试文件,否则为时已晚。通过在我的package.json中的mocha命令中添加--require ts-node/register
来解决此问题:
{
"scripts": {
"test": "eslint . && mocha --require ts-node/register test/*-test.*",
}
}
2)TypeScript仅检查import
版文件的类型,因此我不得不将require行更改为:
import rateLimit = require("../dist/express-rate-limit");