Pull to refresh
4
0
Алексей Березин @BerAlIv

User

Send message

Сорри, не сразу увидел вопрос, вот пример: 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'

Не очень понял, как это можно использовать.

Если предлагается использовать { 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. Общее решение. Спасибо за идею ?

Information

Rating
Does not participate
Registered
Activity

Specialization

Frontend Developer
Senior
JavaScript
TypeScript
Web development