这是如何在打字稿中使用节点配置的后续行动?因为我找不到合适的答案。
我对 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
或强制重新输入config
to 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.ts
为default.js
withtsc
(因此 typescript 不是运行时依赖项)。已相应地更新了 env varNODE_CONFIG_DIR
。目前我这样做,但配置对象是使用额外的层次结构级别创建的。即config.server.timeout
,它变成了config.default.server.timeout
编辑:第三个问题已解决——见评论