一旦导入关联的声明模块,全局声明就可用于所有文件

时间:2017-06-09 14:32:49

标签: typescript

我正在使用typescript 2.3.4,我想阻止 @ types / knockout 公开其全局变量'ko'。所以我在 tsconfig.json 中放了类型:[] ,我明确要导入ko(比如在second.ts中)。 问题是我在second.ts中执行的导入是为first.ts提供 @ types / knockout 全局(ko,KnockoutObservable ...)

first.ts:

const obs : KnockoutObservable<string> = ko.observable("hello"); // should raise error TS2304: Cannot find name 'ko'. and error TS2304: Cannot find name 'KnockoutObservable'.
console.log(obs());

second.ts:

import * as ko from "knockout"; // this import makes 'ko' globally available even for first.ts

export class Foo {
    bar =  ko.observable("bar");
}

tsconfig.json:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": true,
        "sourceMap": false,
        "declaration": false,
        "noUnusedLocals": true,
        "outDir": "dist",
        "types": [
        ]
    },
    "exclude": [
        "node_modules",
        "dist"
    ]
}

完整的解决方案可在此处找到:https://github.com/kingatlas/typescript-sandbox

如何防止ko成为一个全局用户继续将其用作模块(导入...来自?)

1 个答案:

答案 0 :(得分:2)

没有简单的方法。 Knockout typings遵循广泛的模式,允许将它们用作全局模块或模块模块。该模式的副作用是,只要在编译中包含淘汰赛类型,变量ko就会出现在全局范围内。

一种解决方法是分别编译second.tsfirst.ts,每个都有自己的tsconfig.json,稍后将它们与bundler或模块加载器合并。为防止first.ts意外导入knockout,您需要在types中添加空typeRootstsconfig,并在files中明确列出所有类型}。

另一种选择是为淘汰赛做出自己的打字,只将其宣布为模块。同样,您必须在types中设置空typeRootstsconfig,以防止打字稿访问错误的&#39; node_moudles中的输入。