如果值可能未定义,如何优化重复的 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;
};
这看起来很清楚并且对我来说是可读的:
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
);
是否可以为了可读性、简单性或任何其他方式简化以下代码?具体来说,这是否可以在不检查每一行的 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;
};
这看起来很清楚并且对我来说是可读的:
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
);