Typescript 推断模板字符串返回意外的推断结果

Typescript 推断模板字符串返回意外的推断结果,typescript,Typescript,我在想下面的Y将返回test,但是,它返回never,有人知道原因和可能的解决方案吗 type X<T> = T extends `${infer U}.${number}` ? U : never type Y = X<`test.${number}`>; // expect "test" but got never type X=T扩展了`${inferu}.${number}`?U:从来没有 类型Y=X;//期待“测试”,但从未得到 取自 占

我在想下面的
Y
将返回
test
,但是,它返回
never
,有人知道原因和可能的解决方案吗

type X<T> = T extends `${infer U}.${number}` ? U : never
type Y = X<`test.${number}`>; // expect "test" but got never
type X=T扩展了`${inferu}.${number}`?U:从来没有
类型Y=X;//期待“测试”,但从未得到

取自

占位符中的任意类型Any、string、number、boolean或bigint都会导致模板文字解析为string类型

此代码按预期工作:

type X=T扩展了`test.${infera}`?答:从来没有;
类型Z=X;//一串
类型Z1=X;//一串
类型Z2=X;//“假”|“真”
但是,此代码的工作方式与您期望的一样:

type X=T扩展了`${inferb}.${infera}`?B:从来没有;
类型Z=X;//“测试”
为什么它与
boolean
一起工作?因为boolean是一个联合类型,在引擎盖下是“true | false”

因此,这应该是可行的:

类型Z=X;//测试
如果我们已经知道它适用于并集类型,我想我们可以生成一些数字的并集

摘自我的,:

类型值=T[keyof T];
文字数字类型=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
类型NumberString=`${T}`
类型appendDigital=`${T}${literaldights}`
类型MakeSet={
[P/T]:数字

; }; 类型RemoveTrailingZero< T扩展字符串 >=T扩展`${expert Fst}${expert Rest}` ? Fst扩展了'0` ? 拆下导轨零位 :`${Fst}${Rest}` :从不; 键入从_1_到_999=RemoveTrailingZero< 价值观< { [P值]:数字

; } > >; type By=RemoveTrailingZero< 价值观< { [P在V中]:数字

; } > >; /** *这里没有使用递归, *因为我的CPU会爆炸 */ 键入从1_到9999= |从1号到999号 |借 |通过; 类型X=T扩展了`${inferb}.${infera}`?B:从来没有 类型Z=X;//测试

还有另一种解决方案,对CPU来说并不昂贵,但有其自身的局限性:

输入PrependNextNum


因此,由您决定哪种解决方案更适合您。

我认为这是设计限制。这里有TS PR找不到这样的功能它与Xthanks@captain yossarian yea一起工作,只是推断不适用于弦部分。