TypeScript导入场景下内置类型声明合并失效问题如何解决
问题原因
- TypeScript 会将包含
import/export语句的文件识别为独立模块,模块内声明的类型默认仅在当前模块作用域生效,不会自动与全局内置类型合并。 - 带import的文件中你定义的
interface Function,本质是在模块作用域新建了一个仅含applyParams属性的自定义同名类型,而非和全局内置的Function接口合并,因此函数实例f与你自定义的Function类型无共通属性,触发TS2559报错。
解决方案
如果需要在模块文件中扩展全局内置类型,需要显式将扩展声明包裹在declare global块中,修改后代码如下:
import { MyType } from "./MyType"; declare global { interface Function { applyParams?(aa: string[]): MyType; } } function f() {} const a: Function = f; a.applyParams && a.applyParams(["1", "2"]);
如果该类型扩展是项目全局通用的,建议将声明放到独立的.d.ts类型声明文件中:
- 若声明文件无任何
import/export语句,直接写interface Function的扩展即可,默认会作用到全局。 - 若声明文件也存在导入导出语句,仍需要用
declare global包裹扩展内容。
内容的提问来源于stack exchange,提问作者Dmytro Brazhnyk
相关产品推荐
相关产品推荐

