【问题标题】:Global types in typescript打字稿中的全局类型
【发布时间】:2017-08-16 12:42:22
【问题描述】:

有没有办法在你的 typescript 文件中创建一个定义全局可访问类型的文件?

我喜欢打字稿,但发现当我想要真正的类型安全时,我必须从整个系统中显式导入类型。比较烦人。

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    是的,这是可能的。您可以在这里找到所有信息:https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-modifying-module-d-ts.html

    重要的是:

    declare global {
        /*~ Here, declare things that go in the global namespace, or augment
         *~ existing declarations in the global namespace
         */
        interface String {
            fancyFormat(opts: StringFormatOptions): string;
        }
    }
    

    【讨论】:

    • 谢谢,我试过这个并把它放在一个打字文件中,但无法加载它。是否有可以使用的名称,或者我应该只包含在我的入口点中?
    • 我想也许我的问题更多在于了解 .d.ts 文件的导入方式。因为我什至无法判断这些文件是否被导入。除了未知类型之外没有错误信息。
    • @Tal,没有。我有同样的问题。检查我如何让它工作的答案。
    • 我在尝试这个时收到ts(2669)
    • @wegry 看起来像是格式错误:stackoverflow.com/questions/57132428/…
    【解决方案2】:

    我发现接受的答案不起作用(也许是一些需要完成的配置?)。所以经过一些修补,我让它为我工作(也许我也有一些奇怪的配置选项?让我知道它是否不起作用,我会删除这个答案)。

    1. 在合适的文件夹中创建定义文件。我将使用types/global.d.ts
    2. 检查您的tsconfig.json 并将"*": ["types/*.d.ts"] 包含在paths 下。 (如果您愿意,您还应该能够直接处理创建的文件)。
    3. 将您的全局定义直接放入文件的根目录NO declare global 或类似文件。

    现在您应该可以使用此文件中声明的类型了(使用 typescript 3.9.6 和 3.7.5 测试)。

    示例文件:

    // global.d.ts
    declare interface Foo {
        bar: string;
        fooBar: string;
    }
    

    您的tsconfig 应该是什么样子:

    [...]
    "paths": {
        "*": ["types/*.d.ts"]
    },
    [...]
    

    【讨论】:

    • 如果有人愿意解释declare global,那就太好了。正如官方文档中所述。
    • 这个解决方案对我有用。 “接受”的答案没有。谢谢你!
    • 这对我也有用。接受的答案没有。
    • 这是一个更清洁的解决方案,你。
    • 这在 typescript 4.5.2 中对我不起作用。 paths 也需要一个 baseUrl,即使这样,似乎也没有办法让 typescript 拾取 d.ts 文件。它适用于 vscode 中的智能感知,但不适用于 tsc 编译器。
    【解决方案3】:

    有点晚了,但是您可以在项目中的任何位置添加一个 file.d.ts,正如我所注意到的,它会被拾取。

    例如,在我的项目中,我想要一个:

    Optional<T> = T | null;
    

    而且我不知道在哪里添加,所以我在一个文件夹中添加了一个common.d.ts,并添加:

    declare type Optional<T> = T | null;
    

    现在它正在被拾取并且没有错误。甚至不需要导入它。这当然是在 vscode 中测试的,不确定它是否可以在你的编辑器中工作。

    (当然取决于您的文件包含/排除规则,但大多数项目都包含所有 *.ts)

    【讨论】:

    • 非常有助于从 FlowJS 迁移
    【解决方案4】:

    除了塞巴斯蒂安·塞巴尔德的回答

    别忘了

    export {} 
    

    这使它成为真正的模块。

    就是这样。

    这是有效的。

    declare global {
        /*~ Here, declare things that go in the global namespace, or augment
         *~ existing declarations in the global namespace
         */
        interface String {
            fancyFormat(opts: StringFormatOptions): string;
        }
    }
    export {}
    

    【讨论】:

    • 在其他任何地方都没有提到这个!谢谢@byyoung
    猜你喜欢
    • 2020-10-27
    • 2018-12-03
    • 2012-11-28
    • 2018-02-07
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2023-03-28
    • 2020-05-28
    相关资源
    最近更新 更多