Первый ночной прогон с честным критерием (#550) дал 726 из 735: девять мутантов
не доходили до заявленного теста. Причины оказались тремя, а не одной, как я
ожидал по трём случаям из #566:
- статически мёртвая ветка (`if (false && …)`, `if (true) throw`) — TypeScript
теряет сужение, сделанное выше: `united`, `_relation`, `previous`, остаток
функции после безусловного throw. Лечится ложью, ложной в рантайме, но не
статически;
- пустой литерал `[]` выводится как `never[]`, и падают уже вызывающие. Лечится
сохранением типа при потере содержимого (`slice(0, 0)`, `as string[]`);
- несовпадение типов в самой замене: `canonicalizeNumber` отдаёт `unknown` там,
где нужен `T`; подмена резолвера литералом сужала union, и ветка
`resolution.reason` становилась `never`; бракованная метка `case` ломала
`switch` по union.
Смысл каждого мутанта сохранён: все девять прогнаны по `--id=` и краснят свой
заявленный тест.
Issue: #569
User-Visible: no