我正在使用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成为一个全局用户继续将其用作模块(导入...来自?)
答案 0 :(得分:2)
没有简单的方法。 Knockout typings遵循广泛的模式,允许将它们用作全局模块或模块模块。该模式的副作用是,只要在编译中包含淘汰赛类型,变量ko
就会出现在全局范围内。
一种解决方法是分别编译second.ts
和first.ts
,每个都有自己的tsconfig.json
,稍后将它们与bundler或模块加载器合并。为防止first.ts
意外导入knockout
,您需要在types
中添加空typeRoots
和tsconfig
,并在files
中明确列出所有类型}。
另一种选择是为淘汰赛做出自己的打字,只将其宣布为模块。同样,您必须在types
中设置空typeRoots
和tsconfig
,以防止打字稿访问错误的&#39; node_moudles中的输入。