2 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
您是否需要使用 的嵌套級(jí)別obj?如果是,你可以做這樣的事情而不是最后一行:
Object.values(obj).reduce((accValid, value) => {
if (typeof value === 'object') {
return accValid && validateObjectStructure(schema, value);
}
return accValid;
}, valid);
return valid;

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是一個(gè)可能的實(shí)現(xiàn):
function validate(obj, schema, path = '') {
let ok = true;
if (!obj)
ok = obj === schema;
else if (typeof schema === 'function')
ok = obj.constructor === schema;
else if (typeof obj !== 'object')
ok = obj === schema;
else if (Array.isArray(schema))
ok = Array.isArray(obj) && obj.every((x, k) => validate(x, schema[0], path + '[' + k + ']'));
else {
let ko = Object.keys(obj);
let ks = Object.keys(schema);
ok = ko.length === ks.length && ks.every(k => validate(obj[k], schema[k], path + '.' + k));
}
if (!ok)
throw new Error('FAILED ' + path);
return true;
}
// example:
const OBJECT_SCHEMA = {
name: String,
data: [{
isSelected: Boolean,
mId: String,
omnReplaceDict: {
id: String,
text: {
deepObj: {
deepProp: [Number]
}
},
},
}],
};
const obj = {
name: "foo",
data: [{
isSelected: true,
mId: "bar",
omnReplaceDict: {
id: "foo",
text: {
deepObj: {
deepProp: [1, 2, "???", 3]
}
},
},
}]
};
validate(obj, OBJECT_SCHEMA)
注意:雖然這個(gè)自制的類型檢查器看起來(lái)工作正常,但它非常有限(例如如何表達(dá)“字符串?dāng)?shù)字對(duì)的數(shù)組”或“null 或某個(gè)對(duì)象”?),所以它可能是使用一個(gè)選項(xiàng)真正的,就像打字稿一樣。有關(guān)可能的實(shí)現(xiàn),請(qǐng)參見此處。
添加回答
舉報(bào)