Комментарии 10
В исходных типах есть кортежи, которые после конвертации становятся массивами. Это норм.?
Это не кортежи, это такой массив 💁♂️
Если серьезно, хороший вопрос, я не думал о преобразовании кортежей (из наших 1000+ ручек ни одна не использует кортежи)
Вообще идея интересная, можно поресерчить, спасибо)
Наверное, можно пройтись по массиву через infer First, ...infer Rest, это должно сработать, как думаете?
В простых случаях - для кортежей с обязательными элементами - так обычно и делают.
Но у кортежа могут быть необязательные элементы и "хвост", например [string, number?, ...boolean[]], причем "хвост" ещё бывает в начале или в середине кортежа. Тут надо смотреть ключ "0", либо [...infer Rest, infer X].
из наших 1000+ ручек ни одна не использует кортежи
тогда можно не заморачиваться)
Вообще, обычный mapping-type корректно обходит все виды массивов и кортежей:
type KeysToCamelCase<T> = T extends readonly unknown[]
? {[K in keyof T]: KeysToCamelCase<T[K]>}
: T extends Record<string, unknown>
? {[K in keyof T as CamelCase<K>]: KeysToCamelCase<T[K]>}
: T;
поделить строку на три части — часть строки до нижнего подчеркивания, первую букву после и все остальное.
Не будет ли тут ошибки в ключах типа bite_a_cat
?
Но в данном случае KeysToCamelCase<GetUserResponse>
потеряет информацию о том, что внутри у него CityOneCamel = KeysToCamelCase<CityOne>
а не `{ cityOne: string }`. Тип конечно останется валидным и в таком примере не критичным, но если вложенность большая, а CityOne
преобразованный в camelCase используется независимо, то соотносить это всё потом будет больно. Мы поэтому от такого решения отказались и ручками всё что имеет вложенность прописывали, хотя это тоже вариант не очень приятный.
Рецепты TypeScript: перевод ключей объекта в camelCase