Вы ищете перегруженную функцию :
function create(arg1: Type1, arg2?: Type1.options);
function create(arg1: Type2, arg2?: Type2.options);
function create(arg1: Type1 | Type2, arg2?: Type1.options | Type2.options) { ... }
Обратите внимание, что последняя подпись («сигнатура реализации») не является одной из сигнатур перегрузки и должна быть достаточно широкой, чтобы охватить все сигнатуры перегрузки. Вы отсортируете фактические аргументы в теле функции.