即使缺少 require 引用的文件,TypeScript 编译也会成功

TypeScript compilation successful even if referenced file by require is missing

我有项目 1 和项目 2。 在处理了一些文件后,假设它是从项目 1 到项目 2 的 validators/index.ts,我遇到了一个奇怪的问题: 即使通过 require 复制的文件引用的文件不存在,TypeScript 编译成功并且没有错误显示。

简而言之,我说的代码是这样的:

type BuilderFunc = (factory:IValidatorsFactory) => Validator;
function  registerMetaTypeViaBuilderFunction(builderFunc:BuilderFunc) {
  let validator = executeBuilderFunc(factory, builderFunc);
  //errors handling and duplicate checks cropped away as irrelevant for this issue
  validatorsMap.set(validator.id, validator);
}
registerMetaTypeViaBuilderFunction(require('./existing-validator'));
registerMetaTypeViaBuilderFunction(require('./other-validator'));
registerMetaTypeViaBuilderFunction(require('./missing-validator'));
registerMetaTypeViaBuilderFunction(require('./existing-validator3'));
registerMetaTypeViaBuilderFunction(require('./forgot-to-copy-file'));
registerMetaTypeViaBuilderFunction(require('./last-validator'));

并且 TypeScript 编译成功,即使缺少 missing-validator.jsforgot-to-copy-file

从原始 JS 迁移到 TS 的整个过程是希望通过 IDE/compiler 自动捕获此类错误。

顺便说一句,IDE 是 WebStorm。

require 是一个函数,因此它不会在编译时求值,而是在运行时调用。

这是一个运行时“加载程序”。

因此编译器无法检查所需的模块/文件是否存在。

有关更深入的讨论,请参阅 What is this Javascript "require"?

如果你想要编译时检查,那么你可能想要“import”而不是“require”。