TypeScript版本: 3.1.0-dev.201xxxxx
搜索词:
代码:
type OnlyNumber<T extends number> = T
type ToNumber<T extends number | string> =
T extends string ? undefined : OnlyNumber<T>
预期行为:
无错误
实际行为:
错误:
index.ts:37:47 - error TS2344: Type 'T' does not satisfy the constraint 'number'.
Type 'string | number' is not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.
37 T extends string ? undefined : OnlyNumber<T>
** playground链接:**https://www.typescriptlang.org/play/#src=type%20OnlyNumber%3CT%20extends%20number%3E%20%3D%20T%0D%0A%0D%0Atype%20ToNumber%3CT%20extends%20number%20%7C%20string%3E%20%3D%0D%0A%20%20%20%20T%20extends%20string%20%3F%20undefined%20%3A%20OnlyNumber%3CT%3E%0D%0A
相关问题:
7条答案
按热度按时间kognpnkq1#
在我看来,这个问题与 #26199 有关。看起来 TS 没有正确处理底层的 JavaScript 类型。我的意思是,每个 TS 类型应该有两个组件:
底层 JavaScript 类型。它是 {
boolean
,number
,null
,undefined
,object
,symbol
,function
} 的子集,也称为unknown
。另请参阅 JS typeof。接口,对属性、成员函数等的限制。
所有类型计算都应基于这两个独立的组件。
lf5gs5x22#
如果你只是做
extends number ? OnlyNumber<T> : undefined
,这不就完美了吗?wgeznvg73#
看起来不限于基本类型。
h9vpoimq4#
What's wrong with this?
qlfbtfca5#
无论如何,Step是的,这是一个针对特定样本案例的bug的解决方法,效果很好。
kcrjzv8t6#
这仅仅是一个体现,说明我们在条件类型的
false
分支中没有跟踪否定约束。zf9nrax17#
我认为我已经遇到了相同的问题,但在不同的上下文中。我只是在这里添加一个代码片段,以便为寻找相同类型问题的答案的人提供帮助。
可以通过手动缩小类型来解决这个问题:
(请参阅
NonNullable
源代码 in the Typescript docs )