检测`import * as name`标记

时间:2016-11-08 19:09:14

标签: javascript typescript ecmascript-6 es6-modules

我正在编写一些代码,我只想从import * as name from 'module-name'语法应用于令牌。

有办法吗?我记得有一个__ESModule旗帜或类似的东西,但这不在官方规范中,所以我不确定这是否是正确的方法(我找不到确切的文章谈论它,一个参考会有很大帮助。)

即。这就是我想要的(在示例中使用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的{​​{1}}。

我想将其仅应用于FrameworkConfiguration,如上所述。这是因为我不想在不是模块的事物上意外地执行someModule方法。

我的API为configure(),我允许消费者投放任何内容get(key: Newable<T> | T): Promise<T>key只是任何类)。

感谢@estus Newable<T>,我意识到它只适用于互操作,因此在这种情况下无用。

1 个答案:

答案 0 :(得分:0)

没有什么能真正区分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,但这取决于您的转录程序。