在TypeScript中使用静态类型动态加载模块的正确方法

时间:2017-02-07 02:36:14

标签: typescript module

我正在使用TypeScript和WebPack。

我需要动态加载一个模块。 目前的解决方案是:

declare function require(module: string): any;

const m = require("./something");
m.f();

但是这样我放松了我的静态打字:

import {f} from "./something";

有没有办法用我的模块类型键入动态加载的模块?

4 个答案:

答案 0 :(得分:0)

我认为你要找的是

    import * as something from './something'
    something.fn()

否则请详细说明你的问题。

Typesscript

中有几种类型的导入
    import {something} from './something' //represents a named class or function
    something from './something' //represents a default export from a module
    import * as something from './something' // is equivalent to let method=require("something")

请在此处查看完整参考资料https://www.typescriptlang.org/docs/handbook/module-resolution.html

更新

  

编译器检测是否在发出的JavaScript中使用了每个模块。如果模块标识符仅用作类型注释的一部分而从不用作表达式,则不会为该模块发出require调用。这种未使用的引用的省略是一个很好的性能优化,并且允许可选地加载这些模块。

根据文档,systemjs,requirejs和node可以对它进行不同的处理。

//node
If(...){let a=require('something')}
//system
If(...){require(['something'],(a))=>{...}}

答案 1 :(得分:0)

我有一个部分解决方案:

import * as Something from "something"; //this will give you access to type

if(..) {
  let a: typeof Something = require("something")
}

但是有一个问题是,如果“某事”模块暴露了接口或类型,它们将不会显示为“typeof Something”的一部分。所以,如果有人愿意帮忙,那就太好了!

答案 2 :(得分:0)

我只是输入了要求 声明函数require(s:" jquery"):JQueryStatic;

不完美但足够好。

答案 3 :(得分:0)

尝试

const m = await import("./something");