Задачка простая - создать скрипт элемент, если такого нет.



На первом скрине типы ругаются, потому что ТС не сужает тип после переприсваивания переменной, что странно и я не знаю почему так происходит. С юнионами такое работает, а вот с интерфейсами и наследованием, видимо, правила другие. В любом случае, onload правильно ошибку выдает.



На втором скрине, кажется, все красиво, но не типобезопасно, хотя ТС считает иначе. Вот воспроизведение ошибки в рантайме.



На третьем скрине уже решение правильное по типам и рантайму, но вербозное.

Конечно, хотелось бы какой-то хелпер, который делает асерт querySelector на HTMLScriptElement и мы бы могли использовать одну переменную, но у нас на проекте либы для контрактов нету. Как оно могло бы выглядеть можете посмотреть на 4 скрине.



Про рантайм контракты я рассказывал в этом докладе.