【发布时间】:2018-05-22 16:49:42
【问题描述】:
这是 TypeScript 中的一个函数 Maybe 选项。该函数接受一个值,对其应用映射函数,然后返回结果。如果值为 null 或 undefined,则不调用映射函数并返回 Undefined。
function mapA<T, U>(source: T, selector: (v: NonNullable<T>) => U) {
return (source == null || source === undefined) ? undefined : selector(source!);
}
const mapAResult = mapA(2, i => i * i); // Type is number | undefined
好的,所以现在我尝试通过将选择器的返回类型更改为NonNullable 来坚持映射函数永远不会返回 null 或 undefined。当我将鼠标悬停在mapBResult 上时,它说类型是{} | 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!的末尾加上一个感叹号。控制流分析不应该知道此时它不为空吗?
【问题讨论】:
标签: typescript