如何在打字稿中使用node-config?

Dee*_*pak 8 node.js typescript node-config

安装后node-config@types/config

yarn add config
yarn add --dev @types/config
Run Code Online (Sandbox Code Playgroud)

并按照lorenwest / node-config中的描述添加配置

// default.ts
export default {
  server: {
    port: 4000,
  },
  logLevel: 'error',
};
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的应用中使用时:

import config from 'config';

console.log(config.server);
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

src/app.ts(19,53): error TS2339: Property 'server' does not exist on type 'IConfig'.
Run Code Online (Sandbox Code Playgroud)

SNA*_*lim 12

使用这个“import * as config from 'config';” 而不是“从‘配置’导入配置;”

    import * as config from 'config';

    const port = config.get('server.port');
    console.log('port', port);
    // port 4000
Run Code Online (Sandbox Code Playgroud)

配置/开发.json

    {
      "server": {
          "port": 4000
      }
    }
Run Code Online (Sandbox Code Playgroud)

并设置 NODE_ENV=development

 export NODE_ENV=development
Run Code Online (Sandbox Code Playgroud)

注意:如果使用默认值,则无需设置此 NODE_ENV


Tom*_*cer 9

我采用了一种稍微不同的方法——在 JavaScript 中定义变量,并在 TypeScript 中访问它们。

使用以下文件夹结构:

??? config
?   ??? custom-environment-variables.js
?   ??? default.js
?   ??? development.js
?   ??? production.js
??? server
    ??? config.ts
    ??? main.ts
Run Code Online (Sandbox Code Playgroud)

我在根config/文件夹中定义了配置。例如:

??? config
?   ??? custom-environment-variables.js
?   ??? default.js
?   ??? development.js
?   ??? production.js
??? server
    ??? config.ts
    ??? main.ts
Run Code Online (Sandbox Code Playgroud)

现在,在 TypeScript 领域,我定义了一个接口来提供更好的自动完成和文档,并编写一些桥接代码以将配置拉node-config入我的配置映射:

// server/config.ts
import nodeConfig from 'config';

interface Config {
  /** Whether assets should be cached or not. */
  cache: boolean;

  /** The port that the express server should bind to. */
  port: string;
}

const config: Config = {
  cache: nodeConfig.get<boolean>('cache'),
  port: nodeConfig.get<string>('port')
};

export default config;
Run Code Online (Sandbox Code Playgroud)

最后,我现在可以在任何 TypeScript 代码中导入和使用我的配置变量。

// server/main.ts
import express from 'express';
import config from './config';

const { port } = config;

const app = express();

app.listen(port);
Run Code Online (Sandbox Code Playgroud)

这种方法有以下好处:

  • 我们可以使用丰富且经过实战考验的功能,node-config而无需重新发明轮子
  • 我们有一个强类型的、有据可查的配置映射,可以从我们的 TS 代码中的任何地方导入和使用


Dee*_*pak 5

config.get 实用程序可用于获取配置值,如下所示:

import config from 'config';

const port: number = config.get('server.port');
Run Code Online (Sandbox Code Playgroud)

  • 这只是一个解决方法。仍在寻找更好的答案。 (2认同)
  • 这就是预期使用配置的方式。`get`和`has`是使用它的实际原因。它提供了太多的魔法,无法正确键入。您可以像`const config:IConfig&MySchema = require('config')`一样扩展其类型,也可以使用自定义d.ts进行扩展,但是您无法确定期望的属性是否存在,因为它们可以存在于一个配置中,而不能存在于另一个配置中。 (2认同)
  • 不确定“更好的答案”是什么样子,但值得注意的是 `config.get()` 支持泛型。您可以执行“config.get&lt;number&gt;('server.port')”,在某些情况下这可能会更干净一些。 (2认同)

mon*_*001 5

从以前开始,我仍然遇到config无法serverdefault.ts.

下面是我如何使用 npm 配置模块。更新export default {export =

// default.ts
export = {
  server: {
    port: 4000,
  },
  logLevel: 'error',
};
Run Code Online (Sandbox Code Playgroud)

应用内使用 [相同]:

import config from 'config';

console.log(config.get('server'));
Run Code Online (Sandbox Code Playgroud)