缩小输入类型会导致输出类型变宽

时间:2018-05-22 16:49:42

标签: typescript

这是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"); } } ) 的末尾添加一个感叹号。难道不能控制流量分析知道此时它不为空吗?

1 个答案:

答案 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