即使缺少 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.js
和 forgot-to-copy-file
。
从原始 JS 迁移到 TS 的整个过程是希望通过 IDE/compiler 自动捕获此类错误。
顺便说一句,IDE 是 WebStorm。
require 是一个函数,因此它不会在编译时求值,而是在运行时调用。
这是一个运行时“加载程序”。
因此编译器无法检查所需的模块/文件是否存在。
有关更深入的讨论,请参阅 What is this Javascript "require"?
如果你想要编译时检查,那么你可能想要“import”而不是“require”。
我有项目 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.js
和 forgot-to-copy-file
。
从原始 JS 迁移到 TS 的整个过程是希望通过 IDE/compiler 自动捕获此类错误。
顺便说一句,IDE 是 WebStorm。
require 是一个函数,因此它不会在编译时求值,而是在运行时调用。
这是一个运行时“加载程序”。
因此编译器无法检查所需的模块/文件是否存在。
有关更深入的讨论,请参阅 What is this Javascript "require"?
如果你想要编译时检查,那么你可能想要“import”而不是“require”。