На мою имху, лучше всего такой вариант:
const Context= React.createContext(null as unknown as IContext);
...
const { someClass } = useContext(Context);
да, это обман тайпскрипта и ошибка переедет в рантайм, но в случае с контекстом такого не избежать, потому как TS не может проконтролировать наличие провайдера. Данный вариант сразу обнаруживает ошибку в рантайме во время дебага, после чего следует одноразовая починка - добавляется забытый провайдер.
если компонент, использующий значение из контекста, может без него обойтись, и например, что-то осмысленное нарисовать, то можно так:
const Context= React.createContext<IContext | null>(null);
тогда useContext вернет IContext | null, то есть значение просто надо проверять на null и в этом случае что-то делать - например, отрендерить какое-то сообщение. Но если от значения контекста зависят другие хуки, то везде надо втыкать проверку и будет лишний говнокод.
худший вариант - воткнуть в createContext бессмысленную заглушку, формально соответствующую интерфейсу. Это так же приведет к ошибке в рантайме (если забыли провайдер), но ошибка будет скорее всего малопонятная, в отличии от первого варианта.
ну и разумеется, в контексте может лежать что-то простое, например, текущий язык, тогда задание дефолтного значения имеет смысл.