#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.