TypeScript правильно определяет тип возвращаемого значения. Чего он не делает, так это того, что он не проверяет, соответствует ли логика времени выполнения условию, указанному в условном типе, и в вашем случае вызывает ошибку во время компиляции. Вы можете обойти ошибку, используя доступ с индексированным типом, чтобы получить требуемый тип на основе условия.
Он будет иметь другое поведение по сравнению с test
, который объявлен в вашем вопросе, а именно будет выводить тип объединения в случае, когда тип не известен во время компиляции. Реализация по-прежнему не будет проверяться на соответствие логике условного типа, но ошибки нет, и нет необходимости в утверждениях типа:
interface Selector {
t: string;
f: number;
}
function test<T extends boolean>(a: T): Selector[T extends true ? 't' : 'f'] {
// NOTE: not checked that is returns correct type actually
return a ? '1' : 1
}
const t1 = test(true); // string
const t2 = test(false); // number
declare var b: boolean;
const t3 = test(b); // string | number, which may or may not be what you want