用class实现配置类类型化,通过属性声明明确字段类型、可选性与默认值,支持构造函数初始化、泛型继承、readonly/get计算属性,并导出实例确保即用即安全。

用 Class 实现配置类的类型化,核心是把配置项定义为类的属性,并借助 TypeScript 的类型系统明确每个字段的类型、可选性与默认行为,让 IDE 提示更准、运行前检查更早、协作时语义更清晰。
用 class 定义带类型的配置结构
直接用 class 声明配置类,比 interface 或 type 更具表现力——它既能描述形状,又能封装默认值和校验逻辑。
- 字段声明时标注具体类型(string、number、boolean、枚举、联合类型等),避免 any
- 用 ? 标记可选字段,或用 = 提供默认值,两者结合可表达“有则用,无则取默认”
- 构造函数中可做轻量初始化,比如合并传入配置与默认值
例如:
class DatabaseConfig {host: string = 'localhost';
port: number = 5432;
username: string;
password?: string;
ssl: boolean = false;
constructor(config: Partial
Object.assign(this, config);
}
}
配合泛型支持多环境配置继承
不同环境(dev/staging/prod)常共享部分字段,又各自覆盖特定值。用泛型 + extends 可复用基础结构,同时保持类型精确。
- 定义基类 BaseConfig 描述通用字段
- 子类如 DevConfig 继承并扩展字段,TypeScript 会自动合并类型
- 实例化时传入的配置对象会被严格检查,多余字段报错,必填字段未提供也报错
这样既避免重复定义,又不丢失类型约束。
添加只读字段与计算属性增强安全性
配置中有些值不应被意外修改(如服务地址前缀),有些需动态生成(如完整 API URL),可用 readonly 和 get 实现。
- readonly baseUrl: string 防止运行时篡改
- get apiUrl(): string { return `${this.baseUrl}/v1`; } 保证逻辑集中、调用简洁
- TypeScript 能正确推导 get 的返回类型,IDE 中 hover 即见
导出实例而非类型,方便直接使用
最终配置通常以实例形式注入或传递。比起到处写 new Config({...}),推荐导出预设实例:
- 在配置类后加 export const defaultConfig = new DatabaseConfig({});
- 业务代码中直接 import 并解构:const { host, port } = defaultConfig;
- 需要定制时再 new 一次,类型仍受控
这种写法让配置真正“即用即类型安全”,不依赖额外工具或运行时校验。











