TypeScript 对 String 做 Monkey patching 不生效报错是什么原因?
问题原因
- 类型声明不代表运行时实现生效:你扩展
interface String的代码只是TypeScript层面的类型补充,仅用于编译阶段的类型校验,不会实际给String原型添加方法。你当前遇到的是运行时报错,说明类型声明已经通过了编译校验,但真正挂载方法的String.prototype.toCamelCase = ...代码没有在调用前执行,所以运行时找不到该方法。 - 扩展代码未被提前加载:Nest项目的执行顺序从入口文件
main.ts开始,如果你把原型挂载的代码写在了非入口的其他文件,且没有在业务代码执行前主动引入执行,这段挂载逻辑会直接被忽略,甚至被打包工具tree-shake清除。
解决方案
- 把原型挂载逻辑放到项目入口
main.ts的最顶部,保证所有业务代码执行前就完成String原型的扩展:
// main.ts 最顶部添加如下代码 interface String { toCamelCase(): string; } String.prototype.toCamelCase = function (): string { return this.replace(/[^a-z ]/gi, '').replace( /(?:^\w|[A-Z]|\b\w|\s+)/g, (match: any, index: number) => { return +match === 0 ? '' : match[index === 0 ? 'toLowerCase' : 'toUpperCase'](); }, ); };
- 如果扩展逻辑单独抽离到了文件(比如
src/utils/string.extension.ts),需要在main.ts最顶部主动引入该文件,触发挂载逻辑执行:
// main.ts 最顶部 import './utils/string.extension.ts'; // 后续其他入口逻辑
- 若使用了全局类型声明文件(
*.d.ts)存放String接口扩展,需要确认tsconfig.json的include数组包含了该声明文件路径,避免编译阶段报类型不存在的错误。
内容的提问来源于stack exchange,提问作者adaso
相关产品推荐
相关产品推荐

