我们正在converting一个从JavaScript到TypeScript的Node.js模块。在初始转换中,some code错误地将类型定义为string,而该类型应为any。(它被传递给express的res.send(),它接受any。)
以下是代码的相关子集:
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)
...修复看起来很简单,但在修复它之前,我为这个bug创建了一个摩卡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但是,这也是没有错误的。
我还尝试在编译后的js中使用require(),而不是包含ts源& ts-node,但这个变体也通过了。
那么,我错过了什么?为什么typescript没有在这些不匹配的类型上抛出错误?
发布于 2019-07-11 23:55:31
@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只检查imported文件的类型,所以我不得不将REQUIRE行改为:
import rateLimit = require("../dist/express-rate-limit");https://stackoverflow.com/questions/56989794
复制相似问题