【问题标题】:Typescript Global Variable across Files跨文件的打字稿全局变量
【发布时间】:2013-06-27 21:07:29
【问题描述】:

我在没有模块或类的 .ts 文件中创建了一个变量。它看起来就像一个普通的 JavaScript 文件。我希望这个变量可以在变量内部的类中的另一个 .ts 文件中访问。

例如我有:

foo.ts

var foo = "some stuff";

bar.ts

module Bar {
    export class BarClass {
        function getFoo() {
             return foo;
        }
    }
}

我不确定这是不是最好的方法。我试过使用 window.bar 全局,但这似乎不起作用。我是 TypeScript 的新手,正在跳入更大的代码库,所以如果您需要任何进一步的说明,请告诉我。

谢谢!

【问题讨论】:

    标签: javascript scope typescript


    【解决方案1】:

    TypeScript 文件不知道您在其他 TypeScript 文件中所做的任何事情,除非它们有对它们的引用。所以在bar.ts 的顶部应该有一行

    /// <reference path="foo.ts" />
    

    【讨论】:

    • 我也需要declare var foo:any;吗?
    • 不。 Declare 是为了向编译器保证某些东西将存在,否则它不会知道。通常是由 3rd 方库加载的东西。编译器会知道 foo 因为它会引用创建它的文件。
    • 太棒了。这个答案帮助我解决了很多问题。谢谢!
    • 如果外部变量是一个简单的 JavaScript 变量怎么办?
    • @MathiasLykkegaardLorenzen 如果声明文件 (.d.ts) 尚不存在,您需要创建它(查看 github.com/borisyankov/DefinitelyTyped
    【解决方案2】:

    根据您的问题,不确定您遇到的是编译、IDE 还是运行时问题。不过,我想我会分享一个避免全局变量出现这些问题的好方法是创建自己的“类型”文件并将其列在tsconfig.jsontypeRoots 属性中。

    例如,我过去做过的事情是创建一个到 console.log 的快捷方式,它还可以用我希望的样式为消息着色。就这样……

    const pretty = (style: string, ...anything) => {
      anything.forEach(something => 
        console.log(`%c ${something} `, style));
      return moment().format('[Logged @] HH:MM:SS');
    }
    

    所以我不必在我使用的每个 TS 文件中都使用 declare var pretty,我会创建 src/myTypes/globals/index.d.ts

    ...
    declare function pretty(style: string, ...anything);
    ...
    

    然后在我的 tsconfig.json 中

    {
      "compilerOptions": {
        ...
        "typeRoots": ["src/myTypes"]
    

    因此,在您的情况下,如果 foo 是一个您知道会在运行时存在的 var,您可以简单地将 declare var foo: string; 在您的类型文件中,在您的 typeRoots 中列出它并在您的所有项目文件中愉快地使用它,而无需任何进一步的配置。

    【讨论】:

    • 我喜欢这个答案。你能在这里也声明 const 吗?
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多