You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含占位符的TypeScript模板字面量类型子类型规则问询

带占位符的TypeScript模板字面量类型的子类型判定规则

带占位符的TypeScript模板字面量类型(如${number}em)的子类型判定规则并未在官方手册的「Template Literal Types」章节中覆盖,搜索也找不到相关说明。我发现${number} extends ${string}的结果为true,据此推测规则为:若所有匹配模板字面量类型S的字符串都能匹配类型T,则S是T的子类型。请问该推测是否正确?是否存在更多细节?

以下是验证该直觉的测试代码:

type A = `${number}` extends `${number}` ? true : false;
//   ^?
// true,因为两者完全一致,自然匹配

type B = `${number}` extends `${number|string}` ? true : false;
//   ^?
// true,所有匹配`${number}`的字符串都能匹配`${number|string}`

type C = `${number}` extends `${string}` ? true : false;
//   ^?
// true,这在模板字面量语境下是合理的——尽管`number`不是`string`的子类型,但所有匹配`${number}`的字符串(即数字序列)同时也是合法的字符串,因此能匹配`${string}`

type D = `${string}` extends `${number}` ? true : false;
//   ^?
// false,反过来不成立:并非所有字符串序列都是合法的数字

type E = `${number|string}` extends `${number}` ? true : false;
//   ^?
// false,本质和D一致

type F = `${number}` extends `${string}${number}` ? true : false;
//   ^?
// false,匹配`${number}`的字符串无法匹配`${string}${number}`(后者要求字符串前缀+数字)

type G = `${string}${number}` extends `${string}${number}` ? true : false;
//   ^?
// true,两者完全一致

type H = `${number}${string}` extends `${string}${number}` ? true : false;
//   ^?
// false,原因和D、E相同,顺序不同导致匹配范围无包含关系

type I = `${number}x` extends `${string}x` ? true : false;
//   ^?
// true,本质和C一致,只是后缀多了一个x

type J = `${number}x` extends `${string}y` ? true : false;
//   ^?
// false,匹配`${number}x`的字符串后缀是x,无法匹配后缀为y的`${string}y`

内容的提问来源于stack exchange,提问作者T.J. Crowder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:52:47