TypeScript 条件类型不会缩小原始类型,

dohp0rv5  于 5个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(75)

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
相关问题:

kognpnkq

kognpnkq1#

在我看来,这个问题与 #26199 有关。看起来 TS 没有正确处理底层的 JavaScript 类型。我的意思是,每个 TS 类型应该有两个组件:

  1. 底层 JavaScript 类型。它是 { boolean , number , null , undefined , object , symbol , function } 的子集,也称为 unknown。另请参阅 JS typeof

  2. 接口,对属性、成员函数等的限制。

所有类型计算都应基于这两个独立的组件。

lf5gs5x2

lf5gs5x22#

如果你只是做 extends number ? OnlyNumber<T> : undefined ,这不就完美了吗?

wgeznvg7

wgeznvg73#

看起来不限于基本类型。

h9vpoimq

h9vpoimq4#

What's wrong with this?

type ToNumber2<T extends number | string> =
    //OK
    T extends number ? OnlyNumber<T> : undefined
qlfbtfca

qlfbtfca5#

无论如何,Step是的,这是一个针对特定样本案例的bug的解决方法,效果很好。

kcrjzv8t

kcrjzv8t6#

这仅仅是一个体现,说明我们在条件类型的false分支中没有跟踪否定约束。

zf9nrax1

zf9nrax17#

我认为我已经遇到了相同的问题,但在不同的上下文中。我只是在这里添加一个代码片段,以便为寻找相同类型问题的答案的人提供帮助。

type OptionalFn = (() => string) | undefined
// Type 'OptionalFn' does not satisfy the constraint '(...args: any[]) => any'.
// Type 'undefined' is not assignable to type '(...args: any[]) => any'
type OptionalFnReturnType = OptionalFn extends undefined ? undefined : ReturnType<OptionalFn>

可以通过手动缩小类型来解决这个问题:

type OptionalFn = (() => string) | undefined
type OptionalFnReturnType = OptionalFn extends undefined ? undefined : ReturnType<NonNullable<OptionalFn>>

(请参阅 NonNullable 源代码 in the Typescript docs )

相关问题