Typescript 导入关联的已声明模块后,所有文件都可以使用全局声明

Typescript 导入关联的已声明模块后,所有文件都可以使用全局声明,typescript,Typescript,我使用的是typescript 2.3.4,我想防止@types/knockout暴露其全局变量“ko”。因此,我在tsconfig.json中放置了类型:[],并且我明确希望导入ko(如second.ts)。 问题是我在second.ts中进行的导入为第一个.ts提供了@types/knockout全局变量(ko,KnockoutObservable…) 第一,ts: const obs : KnockoutObservable<string> = ko.observable("h

我使用的是typescript 2.3.4,我想防止@types/knockout暴露其全局变量“ko”。因此,我在tsconfig.json中放置了类型:[],并且我明确希望导入ko(如second.ts)。 问题是我在second.ts中进行的导入为第一个.ts提供了@types/knockout全局变量(ko,KnockoutObservable…)

第一,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());
tsconfig.json:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": true,
        "sourceMap": false,
        "declaration": false,
        "noUnusedLocals": true,
        "outDir": "dist",
        "types": [
        ]
    },
    "exclude": [
        "node_modules",
        "dist"
    ]
}
完整的解决方案可在以下位置获得:

我如何防止ko成为一个全局性的模块,并将其作为一个模块(导入…从)?没有简单的方法。正在遵循广泛的模式,允许将它们作为全局或模块使用。这种模式的一个副作用是,一旦编译中包含了敲除类型,变量
ko
就会出现在全局范围内

一种解决方法是分别编译
second.ts
first.ts
,每个都有自己的
tsconfig.json
,然后将它们与bundler或模块加载器组合。为了防止
first.ts
意外导入
敲除
,您需要在
tsconfig
中有空的
类型
类型根
,并在
文件
中明确列出所有键入

另一个选择是为knockout自己打字,只将其声明为一个模块。同样,在
tsconfig
中必须有空的
types
typeroot
,以防止typescript访问节点模块中的“错误”打字

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