Typecsript условного типа с неизвестным - PullRequest
0 голосов
/ 15 февраля 2019

Я пытался правильно набрать следующую функцию:

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 не жалуется.

Ожидается ли такое поведение или я использую неизвестное неверным способом?Есть ли другой способ, как добиться правильного набора для функции?

1 Ответ

0 голосов
/ 15 февраля 2019

Вместо использования Exclude вам нужно использовать свой собственный условный тип, чтобы сопоставить null тип с undefined единицей.Поскольку условные выражения выполняются для каждого члена типа объединения, код довольно прост.Единственное предостережение, что если вы укажете тип возвращаемой функции, которая является условной, вы должны привести действительное значение:

type NullToUndefined<T> = T extends null ? undefined : T

function nullToUndefined<T>(p: T): NullToUndefined<T>
{
    return (p === null ? undefined : p) as NullToUndefined<T>; 
}

const d1 = nullToUndefined(null); // undefined
const d2 = nullToUndefined(1 as number | null); // number | undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...