nauchikus / typescript-definitive-guide

TypeScript: Definitive Guide (book and docs in one)

Home Page:https://typescript-definitive-guide.ru

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Сломанный 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 обсуждаемое поведение было измененно Изменение поведения указания остаточных типов в кортеже. В основном контенте также всё исправленно.