Есть несколько способов сделать это. Один из способов - извлечь защиту в функцию:
interface HasOptional extends UserObj {
foo: string,
bar: string,
baz: string,
}
function hasOptional(user: UserObj): user is HasOptional {
return [user.foo, user.bar, user.baz].every(k => k);
}
if (!hasOptional(user))
throw new Error('missing fields');
Другой способ - переписать условное выражение, чтобы TypeScript мог его понять:
if (!user.foo || !user.bar || !user.baz)
throw new Error('missing fields');
В качестве небольшого примечания, это может быть удивительно использовать «истинность» для проверки существования свойств, потому что !""
истинно, !0
истинно и некоторые другие. Если вы используете .some(k => !k)
для проверки отсутствующих свойств, это вызовет исключение для отсутствующих свойств и пустых строк, которые могут быть или не быть тем, что вы хотите. Обдумайте, подходит ли один из следующих тестов:
// Works if 0/''/false are legal values for foo/bar/baz.
function hasOptional(user: UserObj): user is HasOptional {
return [user.foo, user.bar, user.baz].every(k != null);
}
// Also works if null is a legal value for foo/bar/baz.
function hasOptional(user: UserObj): user is HasOptional {
return [user.foo, user.bar, user.baz].every(k !== undefined);
}
// Works even if undefined is a legal value for foo/bar/baz.
function hasOptional(user: UserObj): user is HasOptional {
return ['foo', 'bar', 'baz'].every(k in user);
}