我有一个通用类Schedule<T, D>
,其中包含一个静态类型防护isSchedule()
。类型防护的第一个版本如下:
static isSchedule(object: unknown): object is Schedule<any, any>;
这是可行的,但这并不理想,因为如果传递的联合类型包含例如Schedule<string, number>
类型,则在以下情况下会丢失string
和number
类型的参数类型防护将类型缩小为Schedule<any, any>
。
示例:
declare const value: string | number | Schedule<string, number>;
if (Schedule.isSchedule(value)) {
// value: Schedule<any, any>
// ideally value would be narrowed to Schedule<string, number> in this case
}
有没有一种构造类型保护的方法,以使类型保护缩小联合类型时不会丢弃任何类型参数(如果存在)?
我尝试了以下操作,这会导致Typescript编译器抛出错误(但是,如果您忽略该错误,它似乎可以工作-显然,我想找到一种不会抛出错误的解决方案) :
type Include<T, U> = Exclude<T, Exclude<T, U>>;
type GetScheduleType<T> = Include<T, Schedule<any, any>> extends never
? Schedule<any, any>
: Include<T, Schedule<any, any>>;
static isSchedule<T>(object: T): object is GetScheduleType<T>;
两个显示问题的屏幕截图: