如何创建不会丢失通用类型参数的类型保护

时间:2019-05-01 04:56:54

标签: typescript typescript-generics

我有一个通用类Schedule<T, D>,其中包含一个静态类型防护isSchedule()。类型防护的第一个版本如下:

static isSchedule(object: unknown): object is Schedule<any, any>;

这是可行的,但这并不理想,因为如果传递的联合类型包含例如Schedule<string, number>类型,则在以下情况下会丢失stringnumber类型的参数类型防护将类型缩小为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>;

更新

两个显示问题的屏幕截图:

  1. Screenshot使用的fn(object: unknown): object is Schedule<any, any>不能正常工作。

  2. Screenshot使用骇人听闻的方法,似乎可以正常工作,但会引发打字错误。

0 个答案:

没有答案