【发布时间】:2022-01-12 14:55:58
【问题描述】:
假设我有以下用户定义的类型保护函数,用于检查值是否为大于 1000 的数字:
function isBigNumber(something: unknown): something is number {
return typeof something === "number" && something > 1000;
}
然后我这样使用它:
const strOrNum: string | number = "asdf";
if (isBigNumber(someVar)) {
console.log(someVar * 10); // works because of type-guard
} else {
// here type of strOrNum is "string" and no longer "string | number"
}
我的问题是 Else 块中 strOrNum 的类型。
看起来类型保护检查类型,并且 TS 也使用类型保护来缩小 Else 块的类型,在这种情况下,这不是我想要的。类型保护是否仅用于检查类型而没有传递给它们的值的附加信息?
在不将isBigNumber 的返回类型更改为boolean 并且不必再次检查strOrNum 的类型以获取If 语句的情况下,是否有解决方案?
【问题讨论】:
-
为什么不将数字类型谓词与
> 1000条件分开? -
@GuerricP 可能是一个解决方案。假设这种检查经常发生。那么使用这样的功能就有意义了。
-
只是为了确认一下,您的实际情况是针对没有特定有限范围的大数?如果预期值足够小,可以使用一个可以工作的联合,否则我认为你需要进行大量令人讨厌的重构
-
@TadhgMcDonald-Jensen 这是我在项目中的实际用例的一个更简单的示例。看起来检查一个类型的子集,然后使用更广泛的类型作为类型保护的返回类型并不是一个好主意。
-
特别是
number在 typescript 中是原子的,将来可能会有数字范围允许这个用例,但现在这不是问题。如果您有类似something is 1001 | 1002 | 1003 | 1004....的东西并且可以满足您的使用需求,它可能会起作用,但如果需要非整数或范围不是有限的,那么您无能为力。
标签: typescript typeguards