【发布时间】:2017-05-24 22:19:36
【问题描述】:
我正在为我的 Angular 项目编写用户定义的类型保护。
以下if 语句(由我的 cmets 标记)运行良好 — 但我不禁认为会有一种更易读的方式来编写它们。
以下首先检查传递给函数的Object 是否具有所需的道具(如果没有则提前退出)。
下一个(和第三个)if 语句检查属性 activity 的值是一个字符串。
第二个和第四个if 语句需要检查props createdAt 和updatedAt 的值是否是String 类型,或者它们是Objects 并且它们有自己的props .sv 谁的值是字符串timestamp。
import { GridMetadata } from './grid-metadata';
export function isGridMetadata(obj: any): obj is GridMetadata {
[ 'activity', 'createdAt', 'totalReps', 'updatedAt' ].every((prop) => {
if (obj.hasOwnProperty(prop) === false) return false;
});
if (typeof obj.activity !== 'string') return false;
// TODO: Better way to write this?
if (typeof obj.createdAt === 'string') {}
else if (obj.createdAt.hasOwnProperty('.sv') && obj.createdAt['.sv'] === 'timestamp') {}
else return false;
if (typeof obj.totalReps !== 'number') return false;
// TODO: Better way to write this?
if (typeof obj.updatedAt === 'string') {}
else if (obj.updatedAt.hasOwnProperty('.sv') && obj.updatedAt['.sv'] === 'timestamp') {}
else return false;
return true;
}
可能确实有更好更易读的方式来编写整个函数?!
【问题讨论】:
-
首先你需要分离你的逻辑用例,然后你可能想对二进制用例使用三进制(只有一个 if 和 else),并为多个用例(多个 if)使用 switch case,这个这样您的代码将非常易读。只是想知道你为什么使用空语句?
-
我认为您对
every语句有疑问。return false不返回您的isGridMetadata函数,它只返回传递给every的匿名函数。
标签: javascript angular if-statement