typescript - TypeScript:转换类型'a | b' 到 'a' 基于 typeof
问题描述
我是 TypeScript 的新手,并试图了解如何使用强制转换。我正在使用一个定义类似于以下函数的 API:
function foo(a: number): number | undefined;
我想对该数字的返回值执行一个函数以始终安全地将其转换为数字,但出现错误:
function myFunc(bar: number | undefined): number {
if (typeof bar === undefined) {
return 0;
} else {
return bar; // error ts(2322)
}
}
ts(2322)
扩展到哪里Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
我觉得这是应该在编译时确定的。显然,我们只进入 else if typeof bar === number
,但在这个代码片段中尝试:
function myFunc(bar: number | undefined): number {
if (typeof bar === number) { // error ts(2367)
return bar;
} else {
return 0;
}
}
错误信息是This condition will always return 'false' since the types '"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"' and 'Requireable<number>' have no overlap.
在这一点上,我对在 TypeScript 中进行强制转换的可能性非常迷茫。有没有办法实现我的目标?任何帮助将不胜感激。
解决方案
if (typeof bar === undefined) {
typeof 运算符产生一个字符串,所以你真正应该测试的是:
if (typeof bar === "undefined") {
正如你所知道的,这种if
情况永远不会成立,所以代码总是进入else
块中。因此,Typescript 推断出返回语句可以在bar
未定义的情况下到达,这与您说要返回的类型冲突。
推荐阅读
- sql - 当我尝试在 PostgreSQL 中创建函数时,我得到 ERROR: syntax error at or near "BEGIN"
- python - 结合字典和列表
- javascript - 是否有 Eslint 规则不让条件和条件主体具有相同的缩进?
- node.js - Node.js 请求模块获取间歇性 401 响应
- javascript - 如何返回 Promise.all 获取 api json 数据?
- javascript - 在 php 中获取 POSTed JSON 数组
- google-api - 如何在 google-auth-library-nodejs 中使用 Oauth2Client 在 Gaxios 请求对象中发送二进制数据
- ssis - 如何通过 SSIS 刷新 tableau 报表
- jenkins - Jenkins 声明性管道从前一阶段的输出设置全局环境变量
- java - 网格袋布局困难重重