【问题标题】:TypeScript - how to exclude one of the typings?TypeScript - 如何排除其中一种类型?
【发布时间】:2016-12-10 07:41:27
【问题描述】:

我正在使用 react-native 和 TypeScript 创建一个 Web + 移动应用程序。所以本质上,我有两个不同的输出用于两个不同的 TS 配置。

对于网络,我的目标是es5 和模块commonjs。所以我必须使用es6-shim 打字来让tsc 在编译时开心。

对于移动设备(不同的tsconfig.json),我的目标是es6 和模块es6。问题是这与es6-shim 打字和tsc 输出许多“重复标识符”错误相冲突。如果我移除 shim,tsc 会很高兴(但随后网络转译停止工作)。

我已经尝试排除在 tsconfig for mobile 中的输入,如下所示:

...
"exclude": [
    "typings/globals/es6-shim",
...

...但不走运,TypeScript 编译器还是找到了输入(可能是因为从 typings/index.d.ts 到 es6-shim 输入的引用)并且仍然为移动构建输出许多“重复标识符”错误。

我是否以错误的方式忽略了?我是不是想错了,还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: typescript react-native


    【解决方案1】:

    如果您有两个不同的tsconfig.json 文件,您可以有两个类型文件夹,分别包含适用于移动/网络的文件。这将稍微取决于您的项目的结构,如果有一个单独的目录可以保留这些目录是有意义的。

    但是,我可能倾向于忽略您的 index.d.ts 文件,并为每种构建类型明确包含您的声明文件。例如

    移动 tsconfig.json:

    {
        "compilerOptions": {
            "module": "commonjs",
            "noImplicitAny": true,
            "removeComments": true,
        },
        "files": [
            "core.ts",
            "typings/globals/something_else.d.ts"
            // Your other files to be compiled or declarations (everything bar your es6-shim)
        ]
    }
    

    然后你可以对 web 做同样的事情,包括你的 es6-shim,或者只是添加所有内容,即index.d.ts

    【讨论】:

    • typings 工具是否支持具有不同目录的多个配置?我不知道。该建议适用于 TypeScript,但如果不支持此功能,则使用类型工具添加和管理新类型会很麻烦。
    • @RonaldZarīts 您在问题中提到您有两个 tsconfig 文件?
    • 我不是海报。我认为这暗示海报有两个 tsconfig.json 文件,但我指的是 typings.json 文件的 typings 工具 - 它是一个带有单独配置文件的单独工具。
    • @RonaldZarīts 啊,我明白了——对不起。我认为这并不重要,您会希望打字安装所有声明,然后让一个 tsc 编译选项使用除其中一个之外的所有声明,而另一个使用所有声明。所以只有一种类型的配置。
    • 不用担心。您建议有两个单独的 /typings 文件夹,例如/typings-es5/typings-es6。虽然它可以与tsc 编译器一起使用,但我只是说以后管理打字包会很麻烦。看起来typings 工具仅适用于名为typings.json 的文件,并将所有内容写入名为/typings 的文件夹。使用不同的文件夹会破坏工具,这会很麻烦,因为 .d.ts 输入包会定期更新。
    【解决方案2】:

    对于 ES6 构建也排除 typings/index.d.ts

    如果您在该文件中还有其他内容需要包含在 ES6 构建中,则将 es6-shim 引用移出到单独的 .d.ts 文件以用于 ES6 构建并排除它。

    【讨论】:

    • 谢谢!排除typings/index.d.ts 文件看起来是正确的解决方案。即使没有索引文件,TSC 也能自动找到所有的打字定义文件。