Typescript 模块中的动态导出

arm*_*nas 5 yaml config typescript

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

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

Run Code Online (Sandbox Code Playgroud)

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

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

declare module '*.yml' {
    const content: any;
    export = content;
}
Run Code Online (Sandbox Code Playgroud)

它将允许这种语法,但这并不理想:

import config from 'my-config.yml';
console.log(config.DATABASE_HOST);
Run Code Online (Sandbox Code Playgroud)

也尝试过这个,但效果不佳:

declare module '*.yml' {
    const content: any;
    export = content;
}
Run Code Online (Sandbox Code Playgroud)

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

declare module '*.yml' 
Run Code Online (Sandbox Code Playgroud)

在 ts 配置中,我启用了esModuleInteropallowSyntheticDefaultImports

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

Aka*_*ava 0

我会推荐一种替代方法。您可以在同一文件夹中为每个 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;
Run Code Online (Sandbox Code Playgroud)

您可以使用 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...

Run Code Online (Sandbox Code Playgroud)

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

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

对于小型一次性使用来说,插件并不是一个好主意,因为未来版本的 typescript 可能会破坏该插件,但您生成的 ts 文件将适用于未来版本,您可以轻松更改脚本以进行一些修改。