typescript - 打字稿:“关注”条件类型
问题描述
Typescript 有什么方法可以推断出b
也属于 typeU extends Foo ? string : number
吗?如果a
是类型,U extends Foo ? string : number
那么在真正的分支中将数字添加到字符串将导致字符串。在 false 分支中,将一个数字添加到 number 最终将成为一个数字。因此,我希望类型b
也可以推断为U extends Foo ? string : number
. 或者这是一个错误的假设?
当我运行下面的代码段时,出现以下错误:
运算符 '+' 不能应用于类型 'U extends Foo ?字符串:数字'和'数字'。(2365)
interface Foo {
propA: boolean;
propB: boolean;
}
declare function f<T>(x: T): T extends Foo ? string : number;
function foo<U>(x: U, d: number) {
const a = f(x);
const b = a + 2;
}
解决方案
该问题与+
TS 中操作员的严格行为有关。TS 绝不允许+
在结果可能超过主要类型string
或主要类型的情况下使用number
。函数以这样的方式foo
使用+
,结果类型是 union string | number
,因为函数是多态的,如果参数x
扩展Foo
,那么我们将得到string
if not number
。
在级别呈现的条件类型f
不会被评估为最终类型foo
,不是,因为我们U
在这个级别有类型变量。如果在下面的示例中明确给出类型,它将被评估为特定类型:
// types provided directly
const x = f(1) // number
const y = f({propA: true, propB: false}) // string
function inside<U>(a:U) {
const x = f(a) // T extends Foo ? string : number // not evaluated
return x + 1; // error
}
function insideButExactBranch<U extends Foo>(a:U) {
const x = f(a)
return x + 1; // ok no error
}
在foo
我们仍然使用 unknownU
时,这就是为什么结果f
被认为是任何可能的,这意味着 - string | number
。如果是这样,+
则无法编译。
换句话说 - TS 无法评估f
函数的结果,因此它从条件类型中获取所有可能的返回类型,这意味着 union string | number
。更多关于为什么使用+
在 TS 中受到限制的更多信息 -为什么 TypeScript 限制 + 运算符
推荐阅读
- r - R tables::tabular() 使用Format() 摆脱scientifc和round
- node.js - Nodejs hana-client 连接池示例
- python - 接受一个数组并产生下一个数字的脚本
- powerbi - 我可以同时使用 Direct Query 和 CSV 发布 POWER BI 仪表板吗?
- python - python 3.0中列表的比较
- sql-server - 如何在审计方面以编程方式记录数据库表值更改?
- r - 基于另一列替换数据框列中的值
- swift - 如何将 UITextField 输入从 String 转换为 Double?
- wordpress - ACF - 根据选择值显示 div
- sql - 每次值更改时如何生成新数字