为什么TypeScript在这里不抛出错误?

时间:2019-07-11 12:58:09

标签: typescript

我们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节点,但是这种变化也通过了。

那么,我想念什么?为什么打字稿不对这些不匹配的类型抛出错误?

1 个答案:

答案 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");