Typescript 类型guard,它断言所有rest参数都不是未定义的

Typescript 类型guard,它断言所有rest参数都不是未定义的,typescript,typeguards,Typescript,Typeguards,是否可以创建一个用户定义的类型保护,让编译器知道传递给它的所有参数都已定义 我想这样做: public static all(...values: unknown[]): values is object[] { return values.every(value => typeof(value) !== 'undefined'); } if (!ParamHelper.all(id, ...dateParts)) { return []; } const

是否可以创建一个用户定义的类型保护,让编译器知道传递给它的所有参数都已定义

我想这样做:

  public static all(...values: unknown[]): values is object[] {
    return values.every(value => typeof(value) !== 'undefined');
  }
    if (!ParamHelper.all(id, ...dateParts)) { return []; }
    const date = new Date(dateParts.join('-'));
    const result = await this.service.getData(assetId, date);
我想使用它,这样我就可以传递一组可能未定义的参数,处理未定义时发生的情况,或者将它们传递给需要值未定义的方法

可能是这样的:

  public static all(...values: unknown[]): values is object[] {
    return values.every(value => typeof(value) !== 'undefined');
  }
    if (!ParamHelper.all(id, ...dateParts)) { return []; }
    const date = new Date(dateParts.join('-'));
    const result = await this.service.getData(assetId, date);
当我尝试上面的朴素版本时,编译器告诉我:

类型谓词不能引用rest参数

所以,我现在认为这是不可能的。但是,我想在放弃之前我会问的


谢谢

不能同时保护多个值。但是,不确定您的示例是否需要这样做:类型保护仅对单个变量有效地起作用。rest参数要么是多个参数(在这种情况下,您只能影响其中一个),要么是单个数组,您无法在函数实现之外访问它(在这种情况下,您无法观察到收缩)。无论哪种方式,它都不起作用。这两个都非常聪明!打字稿太棒了!它们并没有让我达到某种程度,我可以任意断言一组变量有值。我的意思是,如果他们是同一类型的人,他们会的。现在对我来说,如果(!id | | |!day | |!month | | |!year){return;},就更容易说
。你不能同时保护多个值。但是,不确定您的示例是否需要这样做:类型保护仅对单个变量有效地起作用。rest参数要么是多个参数(在这种情况下,您只能影响其中一个),要么是单个数组,您无法在函数实现之外访问它(在这种情况下,您无法观察到收缩)。无论哪种方式,它都不起作用。这两个都非常聪明!打字稿太棒了!它们并没有让我达到某种程度,我可以任意断言一组变量有值。我的意思是,如果他们是同一类型的人,他们会的。现在对我来说,如果(!id | | |!day | |!month | |!year){return;}
,说
更容易些。