看下面的代码片段:
const [interval, setInterval] = useState<PartialInterval | null>(null);
const handleDaySelect = (day: DateData) => {
const isStartSelected = interval?.start;
const isEndSelected = interval?.end;
if (!isStartSelected) {
setInterval({ start: parseDayToDate(day.dateString) });
return;
}
if (isStartSelected && !isEndSelected) {
const isSelectedEndBeforeSelectedStart = isBefore(
parseDayToDate(day.dateString),
interval.start!,
);
if (isSelectedEndBeforeSelectedStart) {
setInterval({
start: parseDayToDate(day.dateString),
end: interval.start,
});
return;
}
setInterval({ ...interval, end: parseDayToDate(day.dateString) });
return;
}
if (isStartSelected && isEndSelected) {
setInterval({ start: parseDayToDate(day.dateString) });
}
};
其中interval
的null检查在函数开始时被赋值为const值。在这种情况下,我想用no-non-null-assertion
这样我就不必把每个声明写成这样interval.start!
这在typescript中是可以实现的而不需要在每个if语句上显式地做检查吗?if(interval?.start)
和isStartSelected
可以继续使用已经定义的检查
提前感谢!
一种方便的方法是使用断言函数来断言和处理interval
不为空,并且在成功断言后返回interval
对象。
Typescript永远不会抱怨它是null,因为它是从函数返回的。
所以这里的答案是:
使用在作用域顶部指定的const变量
因此,而不是编写变量isStartSelected
并将其用作未定义的bool检查,您可以为变量分配一个更好的名称startInterval
,然后ts
将允许您使用您已分配的变量作为未定义检查以及能够在稍后的函数中解析和使用它。
问题过于复杂的简单例子