如何基于Logger派生接口动态生成合法的LegalLoggerKeys类型?
解决方案
先给出完整实现代码,再拆解核心逻辑:
// 1. 基础枚举与Logger接口定义 enum LogType { Network = 'http', File = 'file' } interface Logger { type: LogType; } // 2. 各派生Logger接口 interface DatadogLogger extends Logger { type: LogType.Network; provider: 'datadog'; } interface CloudwatchLogger extends Logger { type: LogType.Network; provider: 'cloudwatch'; } interface Log4jLogger extends Logger { type: LogType.File; provider: 'log4j'; } interface WinstonLogger extends Logger { type: LogType.File; provider: 'winston'; } // 3. 收集所有Logger派生类型到联合类型 type AllLoggers = DatadogLogger | CloudwatchLogger | Log4jLogger | WinstonLogger; // 4. 自动生成合法键类型 type LegalLoggerKeys = AllLoggers extends infer T ? T extends Logger ? `${T['type']}.${T['provider']}` : never : never; // 验证效果 const validKey1: LegalLoggerKeys = 'http.datadog'; // ✅ 合法 const validKey2: LegalLoggerKeys = 'file.winston'; // ✅ 合法 const invalidKey1: LegalLoggerKeys = 'http.winston'; // ❌ 类型不匹配 const invalidKey2: LegalLoggerKeys = 'cloud.datadog'; // ❌ 类型不匹配
核心逻辑说明
- 统一管理Logger类型:把所有派生的Logger接口合并成
AllLoggers联合类型,作为自动推导的数据源。 - 自动拼接合法键:
- 通过
infer T将联合类型拆分为单个成员; - 利用模板字符串类型,把每个成员的
type和provider字段拼接成type.provider格式的合法键; - 所有合法键最终自动合并为
LegalLoggerKeys联合类型。
- 通过
后续新增Logger派生接口时,只需将其加入AllLoggers,LegalLoggerKeys会自动同步更新,完全替代硬编码维护的方式。
内容的提问来源于stack exchange,提问作者SyntaxError
相关产品推荐
相关产品推荐

