【问题标题】:Typescript: Is there any way to use inline require but still get type checking?打字稿:有什么方法可以使用内联要求但仍然可以进行类型检查?
【发布时间】:2020-06-28 15:09:11
【问题描述】:

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

//DataClass.js

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

在将文件转换为ts 之前,智能感知工作得非常好,并为我提供了手机和用户的所有道具的自动完成功能(它们都是 ts 文件)。但是在将文件扩展名更改为ts 后,require 语句返回any,我丢失了类型。

我无法将代码转换为await import,因为这意味着更改所有旧代码库(用于支持异步)。 我不介意将此模块保留为.js 文件,但随后我会丢失从该文件导入数据的每个.ts 文件上的类型,因此即使手机是强类型的,我也可以获得以下好处它。

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

【问题讨论】:

    标签: typescript require migrate


    【解决方案1】:

    好的,这不是一个解决方案,而是一种解决方法(我是 OP),我决定保留带有 js 扩展名的文件,并创建一个单独的具有相同名称的 ts 文件,以获取类型. 当有两个同名文件时,捆绑程序更喜欢js 一个,因此将使用带有内联require 的js 文件的内容,但打字稿编译器更喜欢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};
    

    这绝对不是一个解决方案,只是一个令人讨厌的解决方法。但可悲的是,这是我迄今为止得到的唯一解决方案。如果有人知道更好的解决方案,请在此处发布。

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2012-11-09
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多