В дополнение, по ощущению, ваше решение работает быстрее, чем мое, т.к. в моем решении приходится обрабатывать очень много условных типов. Потестировал сегодня ночью свое решение в ts-essentials (README для PathValue) и нарвался на T2589: Type instantiation is excessively deep and possibly infinite, когда добавляю StringPath extends Paths<Type> для параметра path: StringPath
@AlexandroppolusОгонь решение ? Я проверил, что оно работает с TypeScript 4.4, когда я изначально писал статью, так что большой респект.
У вас не совсем правильно работает на массивах, например, у массивов есть свойство 'length'
Не очень понял, как это можно использовать.
Если предлагается использовать { length: number } для отсеивания массивов от кортежей, есть пограничные случаи структур данных, в которых тоже есть свойство length, но они при этом не являются массивом/кортежем. Т.к. я работаю в видео стриминге, для меня самый простой пример - это TimeRanges - https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges. Но это редкий случай, их 1%, поэтому в целом можно. Но я не стал так делать.
Выкидывать null и undefined можно с помощью типа NonNullable < T >, который под капотом просто T & {}
С NonNullable и {} я согласен. Уточнение, что {} работает только с версии 4.8, а писал я статью в 2021 году, когда был 4.4, но все равно валидно.
Комментируя ваше решение:
Вынесение null | undefined очень хорошая идея, т.к. я рассматривал ветки очень локально, не пытаясь найти общий знаменатель во всем решении.
В остальном: не хочу быть занудой, но условные типы в вашем решении свернуты, то есть если бы я свои свернул, получилось бы ваше решение.
[never[], K] extends [O, number | `${number}`]
Это сокращенная версия, или свертка, для never[] extends O ? K extends number | `${number}` ? ... : never : never . Я старался избегать такие хаки, про это можно отдельную статью писать.
O[number & keyof O]
Это свертка для значений массива, что-то типа type NumericValues<O> = number extends keyof O ? O[number] : never;, который потом вызвался NumericValues<O> (тут number & keyof O - свертка для условного типа в NumericValues )
В целом, конечно, очень красиво и эффектно. Я допишу статью, как до этого дойти и добавлю пункт между 3. Получение пути из массива и кортежи и 4. Общее решение. Спасибо за идею ?
Сорри, не сразу увидел вопрос, вот пример: https://tsplay.dev/WJ09kN
Правда я чекнул, что если взять ваше решение, то будет та же самая ошибка - https://tsplay.dev/wjL5Mm
Я уверен, что проблема где-то на поверхности, но не копал еще вглубь
Ага, понял. Спасибо за развернутый ответ
В дополнение, по ощущению, ваше решение работает быстрее, чем мое, т.к. в моем решении приходится обрабатывать очень много условных типов. Потестировал сегодня ночью свое решение в ts-essentials (README для PathValue) и нарвался на T2589:
Type instantiation is excessively deep and possibly infinite
, когда добавляюStringPath extends Paths<Type>
для параметраpath: StringPath
@AlexandroppolusОгонь решение ? Я проверил, что оно работает с TypeScript 4.4, когда я изначально писал статью, так что большой респект.
Не очень понял, как это можно использовать.
Если предлагается использовать
{ length: number }
для отсеивания массивов от кортежей, есть пограничные случаи структур данных, в которых тоже есть свойство length, но они при этом не являются массивом/кортежем. Т.к. я работаю в видео стриминге, для меня самый простой пример - этоTimeRanges
- https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges. Но это редкий случай, их 1%, поэтому в целом можно. Но я не стал так делать.С
NonNullable
и{}
я согласен. Уточнение, что{}
работает только с версии 4.8, а писал я статью в 2021 году, когда был 4.4, но все равно валидно.Комментируя ваше решение:
Вынесение
null | undefined
очень хорошая идея, т.к. я рассматривал ветки очень локально, не пытаясь найти общий знаменатель во всем решении.В остальном: не хочу быть занудой, но условные типы в вашем решении свернуты, то есть если бы я свои свернул, получилось бы ваше решение.
Это сокращенная версия, или свертка, для
never[] extends O ? K extends number | `${number}` ? ... : never : never
. Я старался избегать такие хаки, про это можно отдельную статью писать.Это свертка для значений массива, что-то типа type
NumericValues<O> = number extends keyof O ? O[number] : never;
, который потом вызвалсяNumericValues<O>
(тутnumber & keyof O
- свертка для условного типа вNumericValues
)В целом, конечно, очень красиво и эффектно. Я допишу статью, как до этого дойти и добавлю пункт между 3. Получение пути из массива и кортежи и 4. Общее решение. Спасибо за идею ?