gpt4 book ai didi

typescript - 导入关联的已声明模块后,全局声明可用于所有文件

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:33 25 4
gpt4 key购买 nike

我正在使用 typescript 2.3.4,我想防止 @types/knockout 暴露其全局变量“ko”。所以我将 types:[] 放在了 tsconfig.json 中,并且我明确想要导入 ko(就像在 second.ts 中)。问题是我在 second.ts 中做的导入为 first.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());

第二个.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 成为全局对象并继续将其用作模块(从...导入)?

最佳答案

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

一种解决方法是分别编译 second.tsfirst.ts,每个都有自己的 tsconfig.json,然后将它们组合起来使用 bundler 或模块加载器。为了防止 first.ts 意外导入 knockout,你需要在那个 中有空的 typestypeRoots >tsconfig,并在 files 中明确列出所有类型。

另一种选择是为 knockout 创建您自己的类型,将其声明为一个模块。同样,您必须在 tsconfig 中有空的 typestypeRoots 以防止 typescript 访问 node_moudles 中的“错误”类型。

关于typescript - 导入关联的已声明模块后,全局声明可用于所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44460463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com