typescript - 我可以制作像“可能未定义的字符串”这样的类型吗
问题描述
注意:我已经--strictNullChecks
开启
我有这样的功能:
export function ensure<T, F extends T>(maybe: T | undefined, fallback: F): T {
if (isDefined<T>(maybe)) {
return maybe
}
if (fallback === undefined) {
throw new Error('Could not ensure a value; please supply a fallback for the given variable')
}
return fallback
}
我用它来摆脱undefined
可能未定义的值的一部分。
const user = ensure(possiblyUndefinedUser, defaultUser)
我想要以下,
const user = ensure(certainlyDefinedUser, defaultUser)
成为编译时错误。即,我希望将此函数与编译器认为具有值的值一起使用是非法的。(这将迫使我正确输入我的函数,见下文)
我已经尝试了一些关于泛型参数的变体,以获得一个类型的T | undefined
值T
不能分配给它的类型。我意识到这可能是不可能的,但我想我会咨询社区而不是继续努力。
我的目标是:如果我想通过类似isNil
or的函数传递参数ensure
,那么我想被迫将参数类型更改为可选。如果一个参数不是可选的,那么我应该 100% 确信不需要对它进行空检查。
解决方案
如果第一个参数不能未定义,我们可以使用条件类型来触发第二个参数的错误。
function isDefined<T>(v: T) : v is Exclude<T, undefined> {
return !!v;
}
export function ensure<T, F extends (undefined extends T ? T : 'First param can\'t be undefined')>(maybe: T, fallback: F): Exclude<T, undefined> {
if (isDefined<T>(maybe)) {
return maybe
}
if (fallback === undefined) {
throw new Error('Could not ensure a value; please supply a fallback for the given variable')
}
//We need a type assertion here as F tehnically might not extend T
return fallback as any;
}
declare var defaultUser: string|undefined;
declare var possiblyUndefinedUser: string| undefined
const user = ensure(possiblyUndefinedUser, defaultUser) //ok
declare var certainlyDefinedUser: string;
const user2 = ensure(certainlyDefinedUser, defaultUser); //error
Playground链接您需要手动选择严格的空检查。
推荐阅读
- validation - Primefaces日历组件手动输入超出maxdate验证的日期失败
- android - 应用程序在后台时信标发送通知
- javascript - 正则表达式替换前两个字符和最后一个字符
- ubuntu - 带有 Littlest JupyterHub 的 Nbgrader 将分配发布到课程目录,但不发布到 /srv/nbgrader/exchange
- android - 查看寻呼机滑动后,Android MVVM 片段按钮单击不起作用
- python - 获取 '@' 和 ';' 之间的子字符串 在“@”之前
- python - 为什么在子图中有一个额外的图表,我在任何地方都没有提到
- c# - 使用 C# API 控制器,我需要将具有相同 ID 的项目合并为一个
- youtube-api - userQuota 限制如何在 YouTube 数据 API V3 上发挥作用?
- javascript - 使用 Chrome 扩展修改请求标头