检测“import * as name”标记
Detecting `import * as name` token
我正在编写一些代码,我只想将其应用于来自 import * as name from 'module-name'
语法的令牌。
有办法吗?我记得有一个 __ESModule
标志或类似的东西但不在官方规范中,所以我不确定这是否是正确的方法(而且我找不到确切的文章谈论它,a参考会有很大帮助)。
即这就是我想要的(在示例中使用 TypeScript):
import * as someModule from 'module-name'
import someDefault from 'module-name'
import { someNamed } from 'module-name'
import otherImport = require('cjs-module')
let somethingElse = {} // anything
checkIsStarModule(someModule) // true
checkIsStarModule(someDefault) // false
checkIsStarModule(someNamed) // false
checkIsStarModule(otherImport) // false
checkIsStarModule(somethingElse) // false
描述 import * as name ...
语法的正确名称是什么? :)
编辑:为问题添加一些上下文。
我正在做类似于 aurelia
的 FrameworkConfiguration
的事情。
而且我只想将其应用于 someModule
,如上所述。这是因为我不想在非模块的东西上不小心执行 configure()
方法。
我的 API 是 get(key: Newable<T> | T): Promise<T>
,我允许消费者输入任何东西作为 key
(Newable<T>
就是任何 class)。
感谢@estus __esModule
,我意识到它仅用于互操作,因此在这种情况下没有用。
module namespace objects 与其他人没有什么真正的区别,任何人都可以创建这样的对象。您可以测试
function isModuleNamespaceLike(o) {
return o === Object(o)
&& o[Symbol.toStringTag] === "Module"
&& Object.getPrototypeOf(o) === null
&& !Object.isExtensible(o)
&& Object.getOwnPropertyNames(o).every(function(p) {
var d = Object.getOwnPropertyDescriptor(o, p);
return d.enumerable && !d.configurable;
});
}
或尝试寻找 __esModule
,但这取决于您的转译器。
我正在编写一些代码,我只想将其应用于来自 import * as name from 'module-name'
语法的令牌。
有办法吗?我记得有一个 __ESModule
标志或类似的东西但不在官方规范中,所以我不确定这是否是正确的方法(而且我找不到确切的文章谈论它,a参考会有很大帮助)。
即这就是我想要的(在示例中使用 TypeScript):
import * as someModule from 'module-name'
import someDefault from 'module-name'
import { someNamed } from 'module-name'
import otherImport = require('cjs-module')
let somethingElse = {} // anything
checkIsStarModule(someModule) // true
checkIsStarModule(someDefault) // false
checkIsStarModule(someNamed) // false
checkIsStarModule(otherImport) // false
checkIsStarModule(somethingElse) // false
描述 import * as name ...
语法的正确名称是什么? :)
编辑:为问题添加一些上下文。
我正在做类似于 aurelia
的 FrameworkConfiguration
的事情。
而且我只想将其应用于 someModule
,如上所述。这是因为我不想在非模块的东西上不小心执行 configure()
方法。
我的 API 是 get(key: Newable<T> | T): Promise<T>
,我允许消费者输入任何东西作为 key
(Newable<T>
就是任何 class)。
感谢@estus __esModule
,我意识到它仅用于互操作,因此在这种情况下没有用。
module namespace objects 与其他人没有什么真正的区别,任何人都可以创建这样的对象。您可以测试
function isModuleNamespaceLike(o) {
return o === Object(o)
&& o[Symbol.toStringTag] === "Module"
&& Object.getPrototypeOf(o) === null
&& !Object.isExtensible(o)
&& Object.getOwnPropertyNames(o).every(function(p) {
var d = Object.getOwnPropertyDescriptor(o, p);
return d.enumerable && !d.configurable;
});
}
或尝试寻找 __esModule
,但这取决于您的转译器。