Сломанный typescript - разный результат выполнения кода из примера spread'а в tuple'ах на разных версиях typescript'а
antixrist opened this issue · comments
Цитата из главы про кортежи:
Когда
spread
применяется к типу без известной длины (обычный массив...number[]
), то тип получаемый в результате также становится неограниченным и все типы следующие после такого распространения (обычный массив) образуют с ним тип объединение (Union
).type Strings = [string, string]; type BooleanArray = boolean[]; // type Unbounded0 = [string, string, ...(boolean | symbol)[]] type Unbounded0 = [...Strings, ...BooleanArray, symbol]; // type Unbounded1 = [string, string, ...(string | boolean | symbol)[]] type Unbounded1 = [ ...Strings, ...BooleanArray, symbol, ...Strings]
Как гласит документация - это работает, начиная с версии 4.0: play.
Но в версии 4.1, разрабы ts похоже что-то поломали и этот пример выдаёт ошибку TS1256: A rest element must be last in a tuple type
(т.е. вернулось поведение до версии 4.0): play.
Может быть стоит сделать об этом ремарку в данном абзаце книги?
Да, действительно.. Но дело в том, что сейчас просто нет возможности во всем разобраться. Упоминать об этом не стоит, но если поведение действительно было обращено, что непременно станет известно после ещё нескольких версий, то я перепишу. Несоответствие, не часто, но бывает.
Нашёл issue на эту тему: microsoft/TypeScript#41701 (comment)
@antixrist в версии 4.2 обсуждаемое поведение было измененно Изменение поведения указания остаточных типов в кортеже. В основном контенте также всё исправленно.