繁体   English   中英

数组元素的“可能未定义”错误的类型保护

[英]Type guard for array element's “possibly undefined” error

TSC 给出了一个错误,该错误作为注释添加到代码中。

tsconfig: "noUncheckedIndexedAccess": true

type Tfactors = [number, number, number, number];

export default function changeEnough(pocket: Tfactors, bill: number): boolean {
  const coinToDolarFactors: Tfactors = [0.25, 0.1, 0.5, 0.01];
  let pocketTotal = 0;

  for (let i in pocket) {

    if (pocket[i] !== undefined && coinToDolarFactors[i] !== undefined) {
      //Object is possibly 'undefined'.ts(2532)
      pocketTotal += pocket[i] * coinToDolarFactors[i];
    }
  }

  return pocketTotal >= bill;
}

我这样解决了这个问题:

type Tfactors = [number, number, number, number];

export default function changeEnough(pocket: Tfactors, bill: number): boolean {
  const coinToDolarFactors: Tfactors = [0.25, 0.1, 0.5, 0.01];
  let pocketTotal = 0;

  for (let i in pocket) {
    const pocketValue = pocket[i];
    const factor = coinToDolarFactors[i];
    if (pocketValue !== undefined && factor !== undefined) {
      pocketTotal += pocketValue * factor;
    }
  }

  return pocketTotal >= bill;
}

我是 TypeScript 的新手,我不知道这是解决此问题的最佳方法。 我可以在不声明pocketValuefactor变量且不使用的情况下解决这个问题! 静音 TSC。

如果不想用! 静音 TSC 或将数组元素分配给新变量,您可以显式键入数组索引,即

type Tfactors = [number, number, number, number];

export default function changeEnough(pocket: Tfactors, bill: number): boolean {
  const coinToDolarFactors: Tfactors = [0.25, 0.1, 0.5, 0.01];
  let pocketTotal = 0;

  for (let _i in pocket) {
    /* --  type it explicitly here -- */
    let i = _i as Exclude<keyof Tfactors, keyof []>;
    // *if* check is not required if you are confident they are defined at runtime  
    if (pocket[i] !== undefined && coinToDolarFactors[i] !== undefined) {
      //Object is possibly 'undefined'.ts(2532)
      pocketTotal += pocket[i] * coinToDolarFactors[i];
    }
  }

  return pocketTotal >= bill;
}

从文档Pedantic Index Signature Checks (--noUncheckedIndexedAccess) ,我们知道

使用--noUncheckedIndexedAccess的一个结果是对数组的索引也会受到更严格的检查,即使在边界检查循环中也是如此。

在这种新模式下,每个属性访问(如foo.bar )或索引访问(如foo["bar"] )都被认为是潜在的undefined

解决方案:

如果您需要访问该属性,则必须首先检查其是否存在或使用非空断言运算符(后缀。字符)。

// Checking if it's really there first.
const pocketValue = pocket[i];
const factor = coinToDolarFactors[i];
if (pocketValue !== undefined && factor !== undefined) {
  pocketTotal += pocketValue * factor;
}


// Basically saying "trust me I know what I'm doing"
// with the '!' non-null assertion operator.
pocketTotal += pocket[i]! * coinToDolarFactors[i]!;

我可以在不声明pocketValue 和因子变量[或] 不使用的情况下解决这个问题吗? 静音 TSC。

不,很遗憾,你不能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM