类型声明中的类型收窄:不可修改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
相关产品推荐
相关产品推荐

