Использование 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 правильным?






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Отлично, что помогли мне разобраться, спасибо. Я знал, что ошибся в своем понимании.