TypeScript报错:string类型无trimLeft/trimStart属性,Angular monorepo求助
trimLeft/trimStart不存在的编译错误 首先咱们先揪出问题的核心:trimStart(以及别名trimLeft)是ES2019的特性,并不是ES2018的!这就是为什么你能正常使用ES2018的Promise.prototype.finally、剩余扩展,但偏偏这两个字符串方法编译报错的原因。VSCode能自动补全是因为它可能加载了更全的类型定义,但TypeScript编译器严格遵循你在tsconfig.json里指定的lib版本做类型检查。
针对你的Angular monorepo场景,给你几个可行的解决方案:
方案1:升级lib到ES2019或更高版本
直接把tsconfig.json里的lib数组中的es2018替换成es2019,这样就能包含ES2019所有特性的类型定义,包括字符串的trimStart/trimLeft:
{ "compilerOptions": { // ...其他配置 "lib": ["es2019", "dom"] } }
如果想一步到位用最新特性,也可以改成"esnext"(Angular通常会处理好降级兼容,不用担心)。
方案2:单独引入ES2019字符串特性
如果你不想升级整个ES版本,只想补全字符串相关的ES2019特性,可以在lib数组里追加es2019.string:
{ "compilerOptions": { // ...其他配置 "lib": ["es2018", "es2019.string", "dom"] } }
这样既保留了ES2018的其他特性,又补上了trimStart/trimLeft的类型定义。
额外检查:Angular Monorepo的子项目配置
因为你是在Angular monorepo环境下,要确认子项目的tsconfig.app.json(比如projects/foo/tsconfig.app.json)有没有覆盖根tsconfig.json的lib配置。很多时候子项目会单独指定lib,导致根配置不生效。比如子项目的配置如果是这样:
{ "extends": "../../tsconfig.json", "compilerOptions": { "lib": ["es2017", "dom"] // 这里覆盖了根配置 } }
那你需要把子项目的lib也同步修改成包含ES2019或者es2019.string。
验证修改
修改配置后,重启VSCode的TypeScript服务(按Ctrl+Shift+P,输入TypeScript: Restart TS Server),然后重新编译项目,应该就能解决这个报错了。
内容的提问来源于stack exchange,提问作者uloco

