【问题标题】:Array function some does not narrow type, even when type predicate is used, alternative solution?数组函数有些不缩小类型,即使使用类型谓词,替代解决方案?
【发布时间】:2020-12-20 15:29:15
【问题描述】:

当使用类型谓词和返回语句时,我希望数组函数能够缩小 dashArray 的类型。

  • 如果 TypeScript 编译器更聪明的话,它是否可以合理地做到这一点,还是我期望这样的事情是错误的?
  • 如何重写才能按预期工作?
export function parseAsDashArray(str: string | null): number[] | null {
  if (!str) {
    return null;
  }

  const values = str.split(/[\s,]+/g);

  const dashArray = values.map((v) => parseAsPercentLength(v));

  if (dashArray.some(isNull)) {
    return null;
  }

  if (isOdd(dashArray.length)) {
    dashArray.concat(dashArray);
  }

  return dashArray;
}

export function isNull(val: any): val is null {
  return val === null;
}

export function parseAsPercentLength(val: string): number | null { ... }

编辑:这是我尝试粘贴到 TypeScript 游乐场的完整示例。

https://www.typescriptlang.org/play

function parseAsDashArray(str: string | null): number[] | null {
    if (!str) {
      return null;
    };

    const values = str.split(/[\s,]+/g);

    const dashArray = values.map(parseAsPercentLength);

    if (dashArray.some(el => el == null)) {
      return null;
    }

    if (dashArray.length % 2 == 1) dashArray.concat(dashArray);

    return dashArray;
}

function parseAsPercentLength(val: string): number | null { 
  return Number.parseFloat(val)
}

类型“(number | null)[]”不可分配给类型“number[]”。类型 '号码 | null' 不可分配给类型 'number'。类型'null'不是 可分配给类型“数字”。

【问题讨论】:

  • 您的错误究竟是什么?我粘贴了你的代码,它工作得很好
  • @Zer0:我添加了一个编辑。我使用了您的代码示例。

标签: arrays typescript


【解决方案1】:
export function parseAsDashArray(str: string | null): number[] | null {
  if (!str) {
    return null;
  }

  const values = str.split(/[\s,]+/g);

  const parsedArray = values.map((v) => parseAsPercentLength(v));
  const dashArray = parsedArray.filter(isValue);

  if (dashArray.length < parsedArray.length) {
    return null;
  }

  if (isOdd(dashArray.length)) {
    dashArray.concat(dashArray);
  }

  return dashArray;
}

【讨论】:

    【解决方案2】:

    TS 编译器实际上是这样做的,据我所知,您正在尝试查找 null 值并在给定的情况下返回 null,我将其编写如下(没有进一步的上下文,您需要提供) .另请注意:我只是省略了 return null 语句并将其缩短为仅返回,因为 TS 编译器无论如何都会忽略它。现在它将返回undefined,但由于undefined == null,它应该不会有什么不同(除非使用===):

    export function parseAsDashArray(str: string | null): number[] {
        if (!str) return;
    
        const values = str.split(/[\s,]+/g);
    
        const dashArray = values.map(parseAsPercentLength);
    
        if (dashArray.some(el => el == null)) return;
    
        if (dashArray.length % 2 == 1) dashArray.concat(dashArray);
    
        return dashArray;
    }
    
    export function parseAsPercentLength(val: string): number | null { ... }
    

    【讨论】:

    • 将代码插入 TypeScript 操场时,我仍然遇到同样的错误。请参阅我的 OP 中的编辑。
    • 嗯,很有趣,在 TS 3.8.3 上对我来说效果很好,我会尝试不同的 @user1283776
    • 我找到了一些其他的解决方案,但这需要第二个数组,很奇怪,我想知道在最后一个 TS 版本中这种行为是如何改变的,检查this
    • 谢谢,我也很好奇。正如你所建议的,我确实通过使用另一个数组解决了这个问题。我会在几分钟内发布一个解决方案供其他人查看。但是我不知道为什么OP代码不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多