【问题标题】:Dynamic export in Typescript moduleTypescript 模块中的动态导出
【发布时间】:2020-06-29 07:28:25
【问题描述】:

我想使用以下语法从 YAML 字段导入属性:

import { DATABASE_HOST, DATABASE_PORT} from 'my-config.yml';

在幕后,我有代码可以解析 YML 并传递所需的正确值,因此这部分不是问题。

但是,我不确定如何在typings.d.ts 中声明模块以支持这种语法。我试过这样做:

declare module '*.yml' {
    const content: any;
    export = content;
}

它会允许这种语法,这是不理想的:

import config from 'my-config.yml';
console.log(config.DATABASE_HOST);

也试过了,但效果不佳:

declare module '*.yml' {
    const content: any;
    export = content;
}

我尝试过的另一件事,但这完全禁用了类型检查。我希望至少能够定义配置字段类型。

declare module '*.yml' 

在 ts 配置中,我同时启用了 esModuleInteropallowSyntheticDefaultImports

我已经在顶部提到过,但想再次澄清一下,我将 YAML 导入 TS/JS 上下文没有问题,问题只是输入正确。

【问题讨论】:

    标签: typescript yaml config


    【解决方案1】:

    我会推荐一种替代方法。您可以在同一文件夹中为每个 yml 文件生成一个 ts 文件,如下所示...

    假设您可以生成一个名为 my-config.ts 的文件(记住它是 ts,而不是 d.ts)

    import c from './my-config.yml';
    
    export interface IMyConfig {
        DATABASE_HOST: string,
        DATABASE_POR: number
    }
    
    const myConfig: IMyConfig = c;
    
    export default myConfig;
    

    您可以使用 gulp 或 grunt 通过查看 yml 文件来生成这些额外的 ts 文件。

    用法

    
    // this will load .ts
    // which in turn will load the .yml
    import myConfig from "my-config";
    
    // you will get intellisense here...
    
    

    要么这样,要么你可以编写一个打字稿语言服务插件来提供声明,但这确实很耗时,生成 ts 文件要简单得多。

    这里有更多关于语言服务插件的信息,https://github.com/microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin

    插件不适合一次性使用,因为未来版本的 typescript 可能会破坏插件,但您生成的 ts 文件将适用于未来版本,您可以轻松更改脚本以进行一些修改。

    【讨论】:

    • 这是一个不错的选择,我考虑过,但是YML文件会非常多,所以每次运行生成不是很方便,所以我试图寻找通配符解决方案.
    • @arminas 你可以写插件,但不是很方便,你的生成器可能可以使用 last modified 来检查文件是否被修改,如果已经生成它可以跳过生成。只需执行一次。
    • 生成的另一个问题是额外的步骤,如果您有 10 个开发人员在系统上工作,他们每次拉取和添加新条目时都必须重新生成定义。或者,如果它被提交到 git 中,那么您最终会在 repo 中获得相同数据的 2 个版本(YML 和 TS),您最终可能会遇到合并冲突和其他问题。我会牺牲强类型来解决这些问题,只需要导出模块any,但似乎没那么简单。
    • 您可以将文件扩展名设为 .yml.ts,并且您可以忽略文件模式,例如 *.yml.ts,因此不会提交所有生成的文件。这样可以避免合并冲突。预构建步骤可以验证并生成新的/修改的文件。这正是 sass webpack 等工作的方式。在这种情况下,插件是更好的选择,但是是的,它需要维护。调试插件会很棘手。
    • 是的,不提交这些定义是一种选择,但在我的情况下,这将很难维护,并且为生成再迈出一步会真的减慢速度。至于插件,我读过它不会解决 TS 输入错误,它只是自动完成的助手等,所以我认为它也不会解决我的问题。
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2019-12-04
    • 1970-01-01
    • 2012-11-06
    • 2020-07-21
    相关资源
    最近更新 更多