Typescript не будет пытаться точно вывести что-либо подобное (в основном вывести перегрузки на основе операторов switch). Лучшее, на что вы можете надеяться от вывода TS, - это объединение всех возможных возвращаемых типов. В вашем случае вы получаете тип возвращаемого значения как {}
, потому что большинство типов совместимы с {}
, даже string
, поэтому объединение {} | string
упрощается до {}
.
Единственное решение здесь - четко указывать типы возвращаемых значений с использованием нескольких перегрузок (хотя вам потребуется объявление функции, перегрузки не могут быть определены в выражении функции):
function play(n: Test.one): "hello"
function play(n: Test.two): {}
function play(n: Test) {
switch (n) {
case Test.one:
return 'hello';
case Test.two:
return {};
default:
exhaustive(n);
throw new Error('hi');
}
};
const b = play(Test.one); // "hello"
Ссылка на игровую площадку
Примечание: ваша реализация не будет проверяться на соответствие перегрузкам, поэтому вы должны убедиться, что реализация и перегрузки согласуются.