You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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'; // ❌ 类型不匹配

核心逻辑说明

  1. 统一管理Logger类型:把所有派生的Logger接口合并成AllLoggers联合类型,作为自动推导的数据源。
  2. 自动拼接合法键:
    • 通过infer T将联合类型拆分为单个成员;
    • 利用模板字符串类型,把每个成员的type和provider字段拼接成type.provider格式的合法键;
    • 所有合法键最终自动合并为LegalLoggerKeys联合类型。

后续新增Logger派生接口时,只需将其加入AllLoggers,LegalLoggerKeys会自动同步更新,完全替代硬编码维护的方式。

内容的提问来源于stack exchange,提问作者SyntaxError

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:35:28