Typescript с --strictNullCheck - проверять ненулевое значение в отдельном методе

Я с удовольствием с опцией компилятора --strictNullCheck

У меня есть этот метод:

Мне нужно проверить, не являются ли заголовки пустыми, прежде чем я смогу их использовать. Замечательно

Теперь я хотел бы перенести операцию проверки в отдельный метод, например так:

Но не я получаю эту ошибку:

Таким образом, нет способа проверить, не является ли некоторый объект или некоторые его свойства нулевым в отдельном методе?

3 ответа

Решение

Используйте охрану типа. Тип защиты - это некоторое выражение, которое выполняет проверку во время выполнения, которая гарантирует тип в некоторой области.

В вашем случае что-то подобное может сработать (трудно сказать, так как вы вставили изображения вместо кода):

function hasHeaders(error: Response): error is Response & { headers: Headers} {
    return error.headers != null
}

Вы можете узнать больше о средствах защиты типов в руководстве по машинописи на https://www.typescriptlang.org/docs/handbook/advanced-types.html

Компилятор TypeScript не настолько умен. Использование:

if (error.headers) {
    return error.headers.get("content-type") || defaultContentType;
} 
return defaultContentType;

Это должно быть довольно просто:

if(err.headers != null) {
  return error.headers.get('content-type') || defaultContentType;
} else {
  return defaultContentType; // or whatever
}

Вы также можете поместить это в свой hasHeaders код, однако, компилятор машинописного текста может или не может все еще выдать это предупреждение.

Еще пара подробностей о проверке нулей:

Проверка значений через их истинное значение

Вы можете просто проверить, является ли значение "правдивым", то есть это не null, undefined, 0, false, или же '' используя значение в качестве логического значения, то есть if (value) { /* do something */ } или же return value || defaultValue или же return value ? value : defaultValue, так далее.

Таким образом, вы можете сделать что-то вроде этого:

return error.headers ?
    (error.headers.get('content-type') || defaultContentType) : 
    defaultContentType /* or whatever */;

Хотя это может быть немного грязно, если ваши имена переменных длинные.

Использование идентификации против проверок на равенство

Некоторые люди предпочитают использовать === (а также !==) (личность) вместо == (а также !=) (равенство), потому что === это более строгая проверка; тем не мение, null == undefined равно true, тогда как null === undefined равно false, поэтому используйте правильный в правильном месте!

Другие вопросы по тегам