0

这是如何在打字稿中使用节点配置的后续行动?因为我找不到合适的答案。

我对 TS 比较陌生,我正在尝试将我们的配置从 json 转换为 typescript,同时尝试在配置中合并类型。

我们目前拥有的是这样的:

// default.json
{
  "server": {
    "timeout": 10
  }
}

// some-code.ts
import config from 'config';
...
const serverTimeout = config.get<number>('server.timeout'); // 10

在这里,我们可以获得所需的配置,但我们需要通过代码中的泛型来指定类型。我正在尝试合并(相对)更强的打字。

干转:

// default.ts
import { MyConfig } from './config-schema.ts'

const conf: MyConfig = {
  "server": {
    "timeout": 10
  }
};

export default conf;

// config-schema.ts
export interface MyConfig {
  server: {
    timeout: number;
  }
}

// some-code.ts
import config from 'config';

console.log(config); // { "server": { "timeout": 10 } }
console.log(config.get<number>('server.timeout')); // 10
console.log((config as any).server.timeout); // 10
console.log(config.server.timeout); // obviously a compile time error.

如您所见,最后一种形式将不起作用并导致编译时错误。我想以某种方式config符合的形状,MyConfig以便config.server.timeout使用 strong type 成为可能number

我需要以某种方式扩展IConfig接口MyConfig或强制重新输入configto IConfig & MyConfig

我的尝试:

// config-schema.ts
import config from 'config';

interface MyConfig {
  server: {
    timeout: number;
  }
}

export (config as any as MyConfig);

// some-code.ts
import config from './config-schema';

console.log(config.server.timeout); // 10

这行得通,但不知何故对我来说感觉不对。

问题

  • 强制使用any...可以以某种方式避免吗?
  • 需要做一些类似import config from '../../core/config-schema';-> 看起来很丑陋,不同文件的路径不同,需要所有项目合作者遵守约定的事情......是否可以保持原样import config from 'config';并抽象出魔法?
  • 在编译时编译default.tsdefault.jswith tsc(因此 typescript 不是运行时依赖项)。已相应地更新了 env var NODE_CONFIG_DIR。目前我这样做,但配置对象是使用额外的层次结构级别创建的。即config.server.timeout,它变成了config.default.server.timeout

编辑:第三个问题已解决——见评论

4

0 回答 0