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

类型声明中的类型收窄:不可修改AllChanges时如何提取Schedule类型?

从AllChanges类型中提取Schedule类型的方法

由于AllChanges是CreateChangeLog和DeleteChangeLog的联合类型,两者的from或to属性包含Schedule类型,我们可以借助TypeScript的条件类型、infer关键字和Extract工具类型来提取目标类型,具体有以下几种实现方式:

方法一:逐层推断筛选

type ExtractSchedule<T> = T extends { from: infer F } 
  ? F extends { flag_active: boolean } 
    ? F 
    : T extends { to: infer U } 
      ? U extends { flag_active: boolean } 
        ? U 
        : never 
      : never
  : never;

// 提取得到的Schedule类型
type ExtractedSchedule = ExtractSchedule<AllChanges>;

这个类型工具会先尝试推断from属性的类型,判断是否包含flag_active字段;如果不符合,再推断to属性的类型并做同样判断,最终返回符合条件的Schedule类型。

方法二:聚合候选类型后筛选

// 先收集AllChanges中from和to的所有可能类型
type AllPossibleTypes = 
  AllChanges extends { from: infer F } ? F : never | 
  AllChanges extends { to: infer U } ? U : never;

// 从聚合类型中筛选出带flag_active的类型
type ExtractedSchedule = Extract<AllPossibleTypes, { flag_active: boolean }>;

也可以合并成更紧凑的写法:

type ExtractedSchedule = Extract<
  AllChanges extends { from: infer F } ? F : never | AllChanges extends { to: infer U } ? U : never,
  { flag_active: boolean }
>;

原理是先通过infer获取AllChanges中from和to的所有候选类型(null | Schedule | Channel),再用Extract工具类型精准筛选出包含flag_active属性的Schedule类型。

内容的提问来源于stack exchange,提问作者A. L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:31:05