我正在爲我的Angular項目編寫一個用戶定義的類型警衛。更多可讀寫複雜的方法如果聲明
以下if
聲明(由我的評論標記)工作得非常好 - 但我不禁想到會有更可讀的方式來編寫它們。
下面首先檢查傳遞給該函數的Object
是否具有所需的道具(如果沒有,則退出)。
下一個(和第三個)if
語句檢查prop的值activity
是一個String。
第二和第四if
語句需要檢查道具createdAt
和updatedAt
的值不是一個字符串類型的,或者說它們是對象,他們有自己的道具.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),這方式您的代碼將非常可讀。只是想知道你爲什麼使用空語句? – ProllyGeek
我認爲你對'every'語句有問題。 'return false'不會返回'isGridMetadata'函數,它只是返回傳遞給'every'的匿名函數。 –