typescript - TypeScript defaultIfUndefined 函数类型
问题描述
我正在尝试编写一个简单的函数,它返回 a defaultValue
, if value === undefined
。
功能超级简单:
const defaultIfUndefined = (value, defaultValue) => {
return value === undefined ? defaultValue : value;
}
但是打字/类型推断将不起作用。
该函数应该简单地undefined
从类型中删除。
我尝试了几种不同的方法,但总是有一些错误。
1.
const defaultIfUndefined = <T>(value: T, defaultValue: Exclude<T, undefined>): Exclude<T, undefined> => {
return value === undefined ? defaultValue : value;
}
2.
const defaultIfUndefined = <T, U extends Exclude<T, undefined>>(value: T, defaultValue: U): U => {
return value === undefined ? defaultValue : value;
}
3.
const defaultIfUndefined = <T, U extends T | undefined>(value: U, defaultValue: Exclude<U, undefined>): Exclude<U, undefined> => {
return value === undefined ? defaultValue : value;
}
4.
const defaultIfUndefined = <T, U extends T | undefined, V extends Exclude<U, undefined>>(value: U, defaultValue: V): V => {
return value === undefined ? defaultValue : value;
}
第一个例子工作正常,只要我return ... as any
.
但是有没有办法让这个工作没有as any
?
--
链接到 TypeScript Playground
解决方案
包含未解析类型参数的条件类型通常需要类型断言。这是因为 typescript 并没有对这些类型做太多的数学运算,它只是检查条件类型的完全匹配。
一个解决方案是避免条件类型:
const defaultIfUndefined = <T>(value: T | undefined | null, defaultValue: T & {}): T => {
return value || defaultValue;
}
let a : string | null = Math.random() > 0.5 ? "" : null;
let aNotNull = defaultIfUndefined(a, "") // string
只是在T & {}
. 如果将其更改为 just T
,则打字稿在推断文字类型时会过于激进,这是& {}
固定的。
推荐阅读
- python-3.x - 船,不是射击
- java - 如何检查输入字符串是否与指定格式匹配?
- html - 进度条 - 颜色变化
- javascript - Javascript diff WikEdDiff:完全禁用块并改进比较
- php - PHP _GET 字符串查询不适用于 htaccess modrewrite
- php - 传递给 Twig\Environment::getTemplateClass() 的参数 1 必须是字符串类型,给定 null
- javascript - Uncaught SyntaxError: missing ) 在参数列表 VM874:10 之后
- css - 我无法让我的样式表加载到 github 中,(下面的链接)
- javascript - 我如何挂钩 js 函数,防止在 if 语句上执行动作并继续函数流
- c++ - 我的应用程序中可以有多个 QDialog 框和我的 MainWindow 吗?