typescript - 力量函数参数的类型
问题描述
我们目前正在对较旧的代码库执行严格的空检查,并构建了自己的助手
type Maybe<T> = T | null | undefined
我们实现了几个辅助函数,它们可能看起来像这样:
function isSafe<T>(val: Maybe<T>): val is T {
// ...
}
像魅力一样工作,我想要的改进是,防止非可能值作为参数传递,因为通过这种类型,可以调用isSafe('hi')
,而不能调用 ,null
情况就是这样每个未包含在Maybe
.
防止这样的调用会消除误解,因为我希望传递给的变量isSafe
是Maybe
.
可悲的是,我还没有找到一种方法来实现这一点,因为它T | null | undefined
允许任何这些类型,而不仅仅是这 3 种的组合。
Maybe
将非值传递给函数时,有没有办法实现类型错误?如果它也允许T | null
并且T | undefined
我们在内部决定我们将处理两个值相同,那么奖励积分将是。
解决方案
这是一个有点难看但符合您的标准的解决方案:
type DefinitelyMaybe<T> = null extends T ? T : undefined extends T ? T : never
function isSafe<T>(val: DefinitelyMaybe<T>): val is NonNullable<typeof val> {
return val !== null && val !== undefined;
}
// Argument of type 'string' is not assignable to parameter of type 'never'.
isSafe('test');
// OK
isSafe('test' as string | undefined);
本质上,只要其中一个或两者都可分配给 ,它就是同一DefinitelyMaybe<T>
件事。否则,它会导致调用站点出现类型错误,因为参数不可分配给它。T
null
undefined
T
never
推荐阅读
- php - Symfony4:在生产服务器上访问 DEV 环境
- amazon-web-services - Amazon Elastic Block Store 和 EC2 驱动器
- asp.net-core - 设置环境变量
- mysql - MySQL查询“in(a,b,c)”,如何以相同的顺序(a,b然后c)返回元素?
- spotfire - 强制用户从过滤器 spotfire 中仅选择一个值
- python - 使用 python gdal 从数组创建投影栅格
- php - sql数组只输出最后一个答案
- javascript - 如何使用对象标签播放 YouTube 视频?
- python-3.x - 如何在 ortools 中更改约束参数的类型
- reactjs - 反应中 devextreme dxItem 元素的模拟是什么?