You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入JS文件时继承方法无法访问的Angular技术问题咨询

问题

现有如下JS文件:

export function A() {
    this.aTest = function(){
        // This work fine
    }
}

function B() {
    this.bTest = function() {
        // this function will not available when import
    }
}

A.prototype = new B();
A.constructor = A;

在Angular项目中导入后执行以下代码:

let test = new A();
test.aTest(); // 正常工作
test.bTest(); // TS2339: Property bTest does not exist on type A

相关情况:

  • 纯JS项目中bTest方法可正常调用
  • 需要解决Angular中导入该JS文件后,所有继承方法都能正常使用的问题
解决方法

1. 新增类型声明文件(最规范)

在JS文件的同级目录下创建同名的.d.ts声明文件(比如JS文件名为utils.js,就创建utils.d.ts),内容如下:

declare class B {
    bTest(): void;
}

declare class A extends B {
    aTest(): void;
    constructor();
}

export { A };

TypeScript会自动读取该声明文件,识别A继承了B的方法,从而消除报错。

2. 用类型断言临时绕过检查

如果不想编写声明文件,调用bTest时通过类型断言明确告知TypeScript该方法存在:

let test = new A();
(test as any).bTest();

// 更严谨的写法:定义包含bTest的联合类型
type AWithB = A & { bTest(): void };
(test as AWithB).bTest();

这种方式适合快速临时解决问题,但长期维护性不如类型声明文件。

3. 重构JS为ES6类语法(推荐)

若允许修改原JS文件,将老式构造函数改为ES6类语法,TypeScript可自动推导类型,无需额外配置:

export class B {
    constructor() {
        this.bTest = function() {
            // 原方法内容
        };
    }
}

export class A extends B {
    constructor() {
        super();
        this.aTest = function() {
            // 原方法内容
        };
    }
}

修改后导入使用,TS不会再报错,代码也更符合现代JavaScript规范。

内容的提问来源于stack exchange,提问作者Wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:00:59