如果值可能未定义,如何优化重复的 TS 检查

How to optimize duplicate TS checks if the value may be undefined

是否可以为了可读性、简单性或任何其他方式简化以下代码?具体来说,这是否可以在不检查每一行的 undefined 的情况下编写?

这些 ok 语句只是被检查的众多过滤器中的一部分,因此这个列表很大而且不守规矩。

  const aOk = data?.a ? data.a.includes(a) : true
  const bOk = data?.b ? data.b <= b : true
  const cOk = data?.c ? data.c >= c : true
  const dOk = data?.d ? data.d === d : true
  const eOk = data?.e ? data.e === e.toString() : true

  if (
    aOk &&
    bOk &&
    cOk &&
    dOk &&
    eOk
  ) {
    return true
  }

  return false

您可以创建一个辅助函数,例如

const fn = (data) = (key, op, value) =>
  data[key] ? op(data[key], value) : true

然后您可以定义一组函数来执行您需要的比较。这可能会消除重复,并提高可维护性。如果数据中的变量和范围匹配,您也许可以使用 operations[key](this[key], data[key]) 之类的东西。

const comp = fn(data)

const aOk = comp(‘a’, myIncludes, a)

如果验证的形式不经常改变,我看不出你的函数有问题。正如另一张海报所提到的,您可以创建一个函数列表。像这样:

type TData = {
  a: number[];
  b: number;
  c: number;
  d: number;
  e: string;
};

const data = {
  a: [3],
  b: 4,
  c: 4,
  d: 1,
  e: "9",
};

const validators: (data:TData, v: { [k in keyof TData]: number }) => {
  [k in keyof TData]: () => boolean;
} = (v) => ({
  a: () => data.a.includes(v.a),
  b: () => data.b <= v.b,
  c: () => data.c >= v.c,
  d: () => data.d === v.d,
  e: () => data.e === v.e.toString(),
});

const all = () => {
  for (const k of Object.values(validators(data, otherData))) {
    if (!k()) return false;
  }
  return true;
};

这看起来很清楚并且对我来说是可读的:

TS Playground

const allOk = Boolean(
  data?.a ? data.a.includes(a) : true
  && data?.b ? data.b <= b : true
  && data?.c ? data.c >= c : true
  && data?.d ? data.d === d : true
  && data?.e ? data.e === e.toString() : true
);