TypeScript扩展/重写第三方库class类型定义不生效如何解决?
问题原因
TypeScript 不支持同名类声明的构造函数签名合并,你这种直接重写类声明的写法是不生效的:原有第三方声明里构造函数的props?: any是宽松度最高的类型,优先级高于你后续补充的严格类型,所以传任意参数都不会触发校验。
可行解决方案
你可以通过覆盖导出类的构造函数类型的方式实现需求,修改你项目里的类型声明文件内容如下即可:
declare module '@library/module' { export interface ImportantProps { name: string; age: number; } // 复用原有类的实例类型,避免破坏其他方法的类型校验 type OriginalInstance = import('@library/module').SomethingImportant; // 定义符合你需求的构造函数签名 interface SomethingImportantConstructor { new (props?: ImportantProps): OriginalInstance; // 如果原类有静态成员,在此处补充对应类型即可 } // 覆盖原有导出的构造函数类型 export const SomethingImportant: SomethingImportantConstructor; }
修改后保存,重启TypeScript服务即可生效,此时调用new SomethingImportant({banana: true})会正常抛出类型错误。
注意:如果原类存在静态成员,你只需要在
SomethingImportantConstructor接口中补充对应的静态成员类型即可,不会影响原有功能的类型校验。
内容的提问来源于stack exchange,提问作者ebbishop
相关产品推荐
相关产品推荐

