Typescript:有没有任何方法可以使用内联require,但仍然可以进行类型检查



我正在将一个遗留代码迁移到typescript,并且一些使用内联的文件需要性能提升(延迟加载(:

//DataClass.js
const Data = {
get Phones() {
return require('./phones.ts').default;
},
get Users() {
return require('./users.ts').default;
},

在将文件转换为ts之前,intelisense运行得非常好,并为我提供了电话和用户的所有道具的自动完成功能(它们都是ts文件(。但是在将文件扩展名更改为ts之后,require语句返回any,而我正在丢失类型。

我无法将代码转换为await import,因为这意味着要更改所有遗留的代码库(用于支持异步(。我不介意把这个模块作为.js文件,但我会丢失从这个文件导入数据的每个.ts文件上的类型,所以即使手机是强类型的,我也可以从中受益。

有没有办法解决这个问题?

好的,这不是一个解决方案,而是一个变通方法(我是OP(,我决定保留具有js扩展名的文件,并创建一个具有相同名称的单独ts文件,用于获取类型。当有两个文件具有相同的名称时,bundler更喜欢js文件,因此将使用具有内联require的js文件的内容,但typescript编译器更喜欢ts文件,因此我在开发时进行所有类型检查,并且在运行tsc时,typscript将为该文件生成正确的声明。

//DataClass.js (real file, will be included in the real bundle)
export const Data = {
get Phones() {
return require('./phones.ts').default;
},
get Users() {
return require('./users.ts').default;
}
}
//DataClass.ts (fake file, will help typescript compiler to generate declaration file for the index)
import phones from './phones.ts';
import users from './users.ts'
export const Data = {phones, users};

这绝对不是一个解决方案,只是一个令人讨厌的变通方法。但遗憾的是,这是我迄今为止唯一的解决方案。如果有人知道更好的解决方案,请在这里发布。

相关内容

最新更新