不幸的是,您不能真正为此使用类型谓词。它们在并集、交点或对象特性类型中不可用。它们唯一能真正出现的地方是作为函数的返回类型,并且它们与传递到函数中的一个参数绑定在一起。和类型谓词与
boolean
在某种程度上,您不希望出现在这里,因为您希望返回值类型是数组,但
true
false
不是数组。
选择性地
Person
. 如果
人
function validatePerson(obj: object) {
const validationErrors = ["dependencies", "name"]
.filter(key => key in obj)
.map(key => `key ${key} is missing from obj`);
const ret: { person?: Person, validationErrors: string[] } = { validationErrors };
if (validationErrors.length === 0) {
ret.person = obj as Person;
}
return ret;
}
declare const x: object;
const validatedPerson = validatePerson(x);
if (validatedPerson.person) {
const b: Person = validatedPerson.person
} else {
throw Error(`invalid person: ${validatedPerson.validationErrors.join(', ')}`)
}
validatedPerson.person
作为一种类型保护,它会自动缩小。
一个更简洁的解决方案是按照@TitianCernicova Dragomir的建议,返回
function validatePerson(obj: object) {
const validationErrors = ["dependencies", "name"]
.filter(key => key in obj)
.map(key => `key ${key} is missing from obj`);
return (validationErrors.length) ? validationErrors : (obj as Person);
}
declare const x: object;
const validatedPerson = validatePerson(x);
if (!Array.isArray(validatedPerson)) {
const b: Person = validatedPerson;
} else {
throw Error(`invalid person: ${validatedPerson.join(', ')}`)
}
现在,返回类型为
validatePerson()
Person | string[]
. 然后使用返回类型是否为数组作为类型保护,这一切都可以正常工作。
希望这些能给你一些前进的想法。祝你好运