使用TypeScript模板字面量类型遇TS4081与TS1110错误求助
TypeScript模板字面量类型报错TS4081和TS1110,私有名称为空字符串
问题描述
我在使用TypeScript的模板字面量类型时遇到了两个少见的编译错误,示例代码如下(即使移除中间的YesNo类型仍会报错):
src/temp.ts:
export const yes_no = ["yes", "no"] as const export type YesNo = (typeof yes_no)[number] export type TemplateLiteralType = `Does this work ${YesNo}`
按照模板字面量类型的语法规则,这段代码应该是合法的,而且我记得之前能正常运行,但现在tsc编译时报出以下错误:
src/temp.ts:5:34 - error TS4081: Exported type alias 'TemplateLiteralType' has or is using private name ''. src/temp.ts:5:35 - error TS1110: Type expected.
注意错误信息里的私有名称是空字符串'',想知道这是模板字面量类型的规则变了,还是编译器bug,或者其他原因导致的?
解决方案
这种错误几乎都是TypeScript版本过低导致的:模板字面量类型是在TypeScript 4.1版本才正式引入的语法特性。如果你的项目使用的TS版本低于4.1,编译器无法正确解析模板字面量的语法,就会抛出这种莫名其妙的错误(因为它不认识${}在类型中的用法,把它当成了非法语法)。
解决步骤:
- 升级TypeScript到4.1及以上版本,比如执行命令:
npm install typescript@latest --save-dev - 重新运行编译命令,此时代码应该能正常通过编译,
TemplateLiteralType会被正确推导为"Does this work yes" | "Does this work no"的联合类型。
另外可以顺带检查tsconfig.json的配置,确保compilerOptions.target不低于ES2015,lib包含ES2015或更高版本,但核心问题还是版本支持。
内容的提问来源于stack exchange,提问作者Niki Herl
相关产品推荐
相关产品推荐

