Проблема в том, что Typescript не сузит универсальный тип, даже если вы делаете проверку типов. Такое поведение просто не реализовано. Поскольку сужение не выполняется, любое значение, которое вы присваиваете T
, должно быть допустимым для любого возможного T
. Также имейте в виду, что, учитывая ваш тип консистента, производные типы возможны, поэтому T
может быть строковым литералом, и тогда вашей проверки недостаточно для обеспечения правильного типа возвращаемого значения:
foo<'bar' >('bar') // Returns 'foo' but 'bar' is expected
Если вы хотите продолжить это, вы будете использовать утверждение типа
function foo<Type = StringVariations>(input: Type): Type {
if ('string' === typeof input) {
return 'foo' as any;
} else {
return input;
}
}