Исключить объект из объединения объектов

#typescript

#typescript

Вопрос:

Библиотека, которую я использую, определяет тип следующим образом:

 export declare type LogInResult = {
    type: 'cancel';
} | {
    type: 'success';
    accessToken: string | null;
    idToken: string | null;
    refreshToken: string | null;
    user: GoogleUser;
};
 

Я хочу создать тип SuccessLoginResult , пропустив { type: 'cancel' } объект, возможно ли это?

Какой-то псевдокод, который я пробовал, не сработал:

 type SuccessLoginResult = Omit<LogInResult, { type: 'cancel' }>
 

Ответ №1:

Вы можете использовать Exclude для этого (но продолжайте читать):

 type SuccessLogInResult = Exclude<LogInResult, {type: 'cancel'}>;
 

Он создает тип, исключая второй тип из первого (объединенного) типа.

Ссылка на игровую площадку

Похоже, вы Extract также можете использовать, что может быть более интуитивно понятным:

 type SuccessLogInResult = Extract<LogInResult, {type: 'success'}>;
 

Я бы подумал, что мне придется включить туда больше, чем просто аргумент type in второго типа, но, видимо, нет, поскольку это, похоже, работает:

Ссылка на игровую площадку

Комментарии:

1. Вау, это великолепно, спасибо. В документах есть все, что нужно только копать. Мне больше нравится ваш Extract подход, потому что мы можем предоставить частичную информацию. Если я использую Exclude его, кажется, я должен предоставить полный, и библиотека может изменить время работы, чтобы включить больше, { type: 'cancel' } так Exclude что это приведет к сбою. Спасибо!

2. @Noitidart — Всегда пожалуйста! Документы TypeScript с каждым разом становятся все лучше, хотя в них по-прежнему многого не хватает. Я не понимаю вашей точки Exclude зрения (если я добавлю больше к типу, мне не нужно будет добавлять больше к Exclude ), но, черт возьми, я с вами — я бы Extract все равно использовал версию, поскольку для меня она более интуитивно понятна.

3. О! Exclude также работает с частичным. Вау, спасибо за ответ в ответе! Для этого решения требуется двойное принятие lol.