Я хотел бы создать функцию, которая принимает аргумент, который обычно является объектом, но может иметь значение null / undefined, и условно возвращать тип, если он не равен null, в противном случае - null.
function objOrNull<T>(t: T): T extends null ? null: T {
if (t == null) return null;
return t;
}
Эта сигнатура функции кажется правильной, я могу вызвать ее с помощью objOrNull({})
, objOrNull({a:42})
, objOrNull(null)
, objOrNull(undefined)
, и возвращаемая переменная имеет ожидаемый тип. Но тело функции не может быть скомпилировано, поскольку ни return null
, ни return t
не могут быть присвоены объявленному возвращаемому типу. Если я объявляю возвращаемый тип как T | null
, функция компилируется, но всякий раз, когда я ее вызываю, тип, который я возвращаю, потенциально имеет значение null, что, очевидно, не то, что я хочу - во время выполнения должно быть возможно определить, что если t
имеет значение null, возвращаемое значение также равно null, иначе это не так?
Есть ли правильный способ реализовать такую функцию, не считая добавления as any
или подобных уродливых приведений типов? Что эквивалентно условному типу extends null ?
для значения? Почему == null
не сообщает компилятору, что я нахожусь в T extends null
состоянии?
(Моим исходным вариантом использования была функция, которая принимает объект или значение NULL, и если объект имеет значение NULL, возвращает NULL, в противном случае возвращает вариант объекта с некоторыми добавленными и удаленными свойствами, но сводит вопрос к моему основному вопросу.) Мой исходный вариант использования
=== null
? Я подозреваю, что==
может обмануть средство проверки типов, потому что условие также верно для0
,undefined
и других ложных вещей. - person Clashsoft   schedule 05.10.2020undefined
не расширяетnull
(при условии, что вы используете--strictNullChecks
). Возможно, вам вместо этого нужно что-то вродеfunction objOrNull<T>(t: T): T extends undefined ? null : T { return (typeof t === "undefined") ? null : t; }
? Этот код имеет ту же проблему, но, по крайней мере, действительно делает то, что вы говорите. - person jcalz   schedule 05.10.2020