interface Car {
name: string
color: string
speed: number
}
interface NewCar {
[P in keyof Car]: string
}
Каким образом в [P in keyof Car] переменной P присваиваются имена свойств Car?
Если in просто проверяет наличие свойства и возвращает true/false.
Само выражение выглядит, непонятно. Что значит P in keyof Car?
Чем является P, если оно нигде не определено? undefined?
Тогда получается undefined in keyof Car всегда возвращает false.
Как происходит итерация и зачем тогда проверять P на наличие в keyof Car, если эти ключи просто присваиваются переменной P на каждой итерации? Короче бред какой-то.
Короче изучайте документацию для TypeScript, и оператор in в типах, а не коде. Ну и такое можете попробовать и посмотреть что будет type F = keyof Car;.
Александр, хотя теперь я дошёл до того, что квадратные скобки видимо каким-то образом итерируют ключи, и если выражение возвращает true, то присваивается значение переменной P. Но до сих пор остаётся непонятным, каким образом скобки могут итерировать.
Александр, В большей части разобрался, если интересно. Если я правильно понял, именно keyof проводит итерацию по ключам.
А вот есть ещё пример:
interface Car {
[key: string]: string
}
const newCar: Car {
name: 'BMW',
color: 'red'
}
Здесь итерация, видимо, происходит неявно. То есть в момент образования объекта newCar где-то "под капотом" скорее всего также появляется что-то типа оператора keyof, позволяя пробежаться по именам свойств.
WbICHA, понял, значит всё-таки скобки итерируют, спасибо. Я не ищу скрытый смысл, просто хочу понять как это работает, потому что TS написан на JS, а значит должна быть логика мне понятна. И поэтому я спрашиваю какой такой "всего лишь синтаксис" они сделали
WbICHA, в JavaScript итерируют например циклы for, while, методы map, forEach и т. д.
А в TypeScript итерируют интерфейсы что ли? Или что? Какой синтаксис то? Или он там абстрактно понимает, читая мысли разработчика, что именно тут нужно проитерировать?
Kolya112151, это всё просто символы, которые говорят что, где и как делать. Твоей утверждение вообще не имеет смысла, просто пойми что надо писать для итерирование (то есть изучи синтаксис).
WbICHA, какое моё утверждение не имеет смысла? Я нашёл уже что вызывает итерацию - квадратные скобки вокруг имени свойства в интерфейсе. (То есть изучил синтаксис)
Kolya112151, Квадратные скобки - это вычисляемый ключ, основы JS. В юнионе вы перебираете ключи оператором in и присваиваете их любой переменной, будь то P, Key или любой другой, которые можете в дальнейшем использовать.
Александр, спасибо. Но находил информацию только о том, что in возвращает true, если ключ существует в интерфейсе. А вот об итерациях и присваиваниях инфы не видел.
Выражение P in keoyf Car значит P = ключ из Car, а именно, name, color, speed. [P in keyof Car] значит, что поля NewCar должны быть name, color, speed. Сделано это для удобства. Любой объект типа NewCar должен иметь эти поля.