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, поэтому используйте правильный в правильном месте!