Я пытался правильно набрать следующую функцию:
function nullToUndefined(p: null): undefined;
function nullToUndefined<T extends Exclude<unknown, null>>(p: T): T;
function nullToUndefined<T extends Exclude<unknown, null>>(p: null | T): T | undefined
{
return p === null ? undefined : p;
}
В некоторых случаях она работает нормально:
const a = nullToUndefined(null); // undefined
const b = nullToUndefined(true); // true
const c = nullToUndefined(10); // 10
, однако она не работает для следующей частис кодом
const d = nullToUndefined(1 as number | null);
тип переменной d равен number | null
, но я бы хотел видеть number |
undefined
.Проблема, похоже, заключается в T extends Exclude<unknown, null>
- так как unknown - это супертип всех типов, я ожидал бы, что T будет всем, кроме нуля, но, очевидно, это не работает так.
Например, я могу сделать
const e: Exclude<unknown, null> = null;
и компилятор TS не жалуется.
Ожидается ли такое поведение или я использую неизвестное неверным способом?Есть ли другой способ, как добиться правильного набора для функции?