Почему keyof дает объединение свойств, а не пересечение свойств?

Использование keyof со следующим типом дает union имен свойств:

type Person = {
    name: string;
    age: number;
    location: string;
}

type K1 = keyof Person; // "name" | "age" | "location"

Точно так же, если я использую помощник Omit, который использует Exclude, я должен предоставить union свойств для keyof T, где интуитивно я бы ожидать предоставил intersection свойств, которые нужно опустить, но это не так:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type PersonName = Omit<Person, "location" | "age">;  
// type Person = { name: string }

Я думаю, исходя из моего понимания, вместо этого будет следующая композиция type, поскольку она требует intersection всех свойств, а не union свойств:

// This isn't valid, but what I'd expect using keyof
type K1 = keyof Person; // "name" & "age" & "location"
type PersonName = Omit<Person, "location" & "age">;

Когда дело доходит до keyof, где я ошибаюсь в своем понимании свойств, полученных как union, в отличие от intersection ключей свойств для этого type? type не может существовать, когда каждое свойство является сценарием либо, как описывает union. type недействителен, если только он не является intersection из всех properties правильным?

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

The type can't exist with each property being an either scenario as a union describes.

keyof T не описывает тип T, он описывает тип возможных ключей, которые можно использовать для получения свойств T, то есть тип переменной key в выражении t[key], где t значение имеет тип T. В конце концов, это система типов для javascript, где доступ к свойствам t.propertyName точно такой же, как и немного более сложный t["propertyName"], а последний всегда позволял динамически получать доступ к свойствам объекта, используя переменную, содержащую имя свойства.

Это тип объединения, потому что вы можете использовать любой ключ в выражении t[key].

Пересечение литеральных типов просто не имеет смысла — тип "name" & "age" & "location" означает, что значение переменной равно всем трем литеральным значениям одновременно, что невозможно. Внутри такие пересечения приводятся к типу never.

type "name" & "age" & "location" means that a variable value is equal to all three literal values at the same time, which is impossible Отлично, что помогли мне разобраться, спасибо. Я знал, что ошибся в своем понимании.
atconway 22.04.2019 22:44

Другие вопросы по теме