我正在使用TypeScript和WebPack。
我需要动态加载一个模块。 目前的解决方案是:
declare function require(module: string): any;
const m = require("./something");
m.f();
但是这样我放松了我的静态打字:
import {f} from "./something";
有没有办法用我的模块类型键入动态加载的模块?
答案 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");