Если я понимаю ваш вопрос, это должно быть то, что вы ищете.
interface FalseAuthState {
isSignedIn: false;
}
interface TrueAuthState {
isSignedIn: true;
token: string;
user: User;
}
type AuthState = FalseAuthState | TrueAuthState;
Итак, если бы у вас был объект типа
// This does not throw an error because Typescript knows it's correct
const noAuth: AuthState = {
isAuth: false
}
// This will throw an error because Typescript demands a User and Token.
const yesAuth: AuthState = {
isAuth: true
}
// This will not throw an error.
const realAuth: AuthState = {
isAuth: true,
token: "ABCD123",
user: new User()
}
function printUser(auth: AuthState) {
if (auth.isAuth) {
console.log(auth.user); // Typescript knows there's supposed to be a user so there is no error
}
}
function badPrintUser(auth: AuthState) {
if (auth.isAuth === false) {
console.log(auth.user); // Typescript will throw an error because there's no supposed to be a user here.
}
}
в вашемНапример, способ проверки такой:
const userName = auth.isSignedIn && auth.user.name
или
const userName = auth.isSignedIn ? auth.user.name : undefined;
К сожалению, вы не сможете удалить атрибуты из самого объекта и использовать этов ваших интересах.Если бы вы сделали это
const { isSignedIn, user } = (auth as TrueAuthState);
const userName = isSignedIn && user && user.name; // You still have to do this unless you really sure that the auth is a TrueAuthState