这是TypeScript中一个功能性的Maybe Option。此函数接受一个值,对其应用映射函数,并返回结果。如果值为null或未定义,则不会调用映射函数并返回Undefined。
NonNullable
好的,现在我尝试通过将选择器的返回类型更改为mapBResult
来确保映射函数永远不会返回null或undefined。当我将鼠标悬停在{} | undefined
上时,它表示类型为function mapB<T, U>(source: T, selector: (v: NonNullable<T>) => NonNullable<U>) {
return (source == null || source === undefined) ? undefined : selector(source!);
}
const mapBResult = mapB(2, i => i * i); // Type is { } | undefined
。这对我来说似乎很奇怪。我想我说该函数可以返回比上述函数更少的可能值,但结果类型更宽。不太可能的输入导致可能的输出更少吗?
source!
其次,为什么我需要在.DataSource(datasource => datasource
.Ajax()
.Read(read => {
if (User.IsInRole("Admin")) {
read.Action(MVC.ControllerName.ActionNames.Read,
MVC.Controller.Name).Data("function");
}
else
{
read.Action(MVC.OtherController.ActionNames.OtherRead,
MVC.Controller.Name).Data("function");
}
}
)
的末尾添加一个感叹号。难道不能控制流量分析知道此时它不为空吗?
答案 0 :(得分:1)
好的,所以现在我尝试通过将选择器的返回类型更改为NonNullable来确保映射函数永远不会返回null或未定义
这不是NonNullable
所做的。
你想要的是这个:
function mapB<T, U extends object | string | number | boolean>(source: T | null | undefined, selector: (v: T) => U) {
return (source == null || source === undefined) ? undefined : selector(source);
}
const mapBResult = mapB(2, i => i * i); // Type is number