Angular tslint“抱怨”;必须使用if语句“过滤语句”;使用开关时
假设我有以下方法:Angular tslint“抱怨”;必须使用if语句“过滤语句”;使用开关时,angular,typescript,angular-cli,tslint,Angular,Typescript,Angular Cli,Tslint,假设我有以下方法: getErrorMessage(state: any, thingName?: string) { const thing: string = state.path || thingName; const messages: string[] = []; if (state.errors) { for (const errorName in state.errors) { switch (errorName) {
getErrorMessage(state: any, thingName?: string) {
const thing: string = state.path || thingName;
const messages: string[] = [];
if (state.errors) {
for (const errorName in state.errors) {
switch (errorName) {
case 'required':
messages.push(`You must enter a ${thing}`);
break;
case 'minlength':
messages.push(`A ${thing} must be at least ${state.errors['minlength'].requiredLength}characters`);
break;
case 'pattern':
messages.push(`The ${thing} contains illegal characters`);
break;
case 'validateCardNumberWithAlgo':
messages.push(`Card doesnt pass algo`);
break;
}
}
}
return messages;
}
当我跑的时候
ng lint
我得到以下错误:
for(…in…)语句必须使用if语句进行筛选
看看类似的情况,我不认为这个答案适用于我的情况。毕竟switch语句属于if-else-if梯形图的类别
TSLILT应将转换语句看作IF语句的形式,但它不?? 这让我很好奇,所以我检查了这个规则。它有一个名为
isFiltered
的函数,它似乎只检查ts.SyntaxKind.IfStatement
,而不检查ts.SyntaxKind.SwitchStatement
function isFiltered({statements}: ts.Block): boolean {
switch (statements.length) {
case 0: return true;
case 1: return statements[0].kind === ts.SyntaxKind.IfStatement;
default:
return statements[0].kind === ts.SyntaxKind.IfStatement && nodeIsContinue((statements[0] as ts.IfStatement).thenStatement);
}
}
因此,除非要将对象转换为数组,否则需要使用提供的链接中的修复程序。Object.keys
,或if
语句:
for (const errorName in state.errors) {
if (state.errors.hasOwnProperty(errorName)) {
switch (errorName) {
有趣的是,您可以使用任何类型的
if
语句,错误就会消失。没有检查您是否正在调用hasOwnProperty
该规则旨在防止您在使用for时访问对象原型上定义的属性。。在中
但是,您可以重构代码,使其不再使用,并使其更易于维护和开发
例如:
接口错误消息工厂{
(事物:字符串,状态?):字符串
}
类型错误='required'|'minlength'|'pattern'|'ValidateCardNumber WithAlgo'
让errorFactory:{[e in Errors]:ErrorMessageFactory}={
必需:(thing)=>`您必须输入${thing}`,
minlength:(thing,state)=>`A${thing}必须至少为${state.errors['minlength'].requiredLength}个字符`,
pattern:(thing)=>`The${thing}包含非法字符`,
validateCardNumberWithAlgo:(thing)=>`卡不通过algo`
}
函数getErrorMessage(状态:any,thingName?:string){
if(state.errors){
返回state.errors.map((error)=>errorFactory[error](thingName,state));
}
返回[];
}
你可以在操场上看到一个工作片段。使用if-else而不是switch?如果我有100个条件要检查,你会建议同样的事情吗?我实际上会建议你将内部for循环重构为其他内容。:)方法调用,或者映射到错误数组以创建错误消息列表。:)@toskv的可能重复我认为重点是规则规定,
if
语句应该在中的for…之后,switch语句可以看作是一种if
语句,但它不能解决错误。