含占位符的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
相关产品推荐
相关产品推荐

