TypeScript如何匹配字符串字面量模板的结果类型?
如何匹配TypeScript中模板字面量生成的
${number}类型 要匹配To_String<number>生成的${number}类型,核心是修正条件类型的匹配语法,并调整分支顺序:
问题根源
你之前写的Number extends '${number}'是错误的——这里的'${number}'是一个普通字符串字面量(内容为${number}),而非TypeScript的模板字面量类型语法。真正代表所有数字字符串的类型是${number},不需要加引号。
正确实现方案
调整Remap类型的分支顺序,先匹配具体的数字字面量,最后匹配${number}类型:
type To_String<N extends number> = `${N}` type Remap<Number> = Number extends '0' ? 'is zero' : Number extends '1' ? 'is one' : Number extends '2' ? 'is two' : Number extends `${number}` ? 'is Template literal result' : 'other number' // 测试用例 type One = Remap<To_String<1>> // 'is one' type OtherLiteral = Remap<To_String<5>> // 'other number' type TemplateResult = Remap<To_String<number>> // 'is Template literal result' type NonNumberString = Remap<'abc'> // 'other number'
关键说明
${number}是TypeScript内置的特殊模板字面量类型,代表所有合法的数字字符串(包括整数、小数、负数等)。- 分支顺序必须优先匹配具体字面量:因为
'1'、'2'这类字面量是${number}的子类型,如果把${number}分支放在前面,会直接捕获所有数字字面量,导致具体分支无法命中。
内容的提问来源于stack exchange,提问作者Jarek
相关产品推荐
相关产品推荐

