TypeScript扩展Array原型后VSCode报错如何不开启suppressImplicitAnyIndexErrors解决
问题原因
你本地VSCode触发类型报错的核心原因是你写的Array接口扩展没有被TypeScript识别为全局类型合并:
- TypeScript Playground默认处于全局作用域,你直接写的
interface Array<T>会自动和全局的原生Array接口合并,因此类型正常 - 本地项目中的文件如果包含
import/export关键字,会被识别为模块,模块内写的interface Array<T>是局部接口,不会和全局Array合并,导致调用时找不到foo属性的类型定义
正确解决方案
1. 新增全局类型声明文件
在项目根目录新建global.d.ts声明文件,内容如下:
// 声明要扩展全局作用域下的类型 declare global { interface Array<T> { // 不要用宽泛的Function类型,直接写精确的函数类型 foo: <R>(param: R) => void } } // 加这行是为了让当前文件被识别为模块,避免declare global报错 export {}
2. 调整tsconfig配置
确保tsconfig.json的include字段包含你新增的声明文件,示例:
{ "include": ["src/**/*", "global.d.ts"] }
3. 调整实现代码的类型标注
原来的实现代码可以删除局部的interface Array<T>定义,调整函数的this类型标注即可:
Object.defineProperty(Array.prototype, "foo", { value: function <R>(this: any[], param: R) { console.log(param); } }); // 两种调用方式都不会触发类型错误 [].foo("test"); []["foo"]("test");
额外说明
不需要开启suppressImplicitAnyIndexErrors配置,上面的方案就可以完全覆盖两种调用场景的类型校验,同时还能保留foo方法的参数类型提示。
内容的提问来源于stack exchange,提问作者Functor
相关产品推荐
相关产品推荐

