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

如何实现含protected属性的TypeScript类?第三方库模拟遇阻求助

解决TypeScript模拟带protected属性第三方类的报错问题

问题分析

你遇到的报错核心原因是TypeScript的protected成员规则:protected成员仅允许通过extends继承的子类拥有同名成员,而implements会要求类的成员必须是public(因为接口成员默认都是public),所以直接用implements实现带protected属性的类会触发类型检查错误。

结合你的场景(第三方库通过tsconfig path关联,只能用import type引入,无法直接extend),可以用以下几种方案解决:

方案1:类型断言绕开检查

直接在模拟类定义后添加类型断言,强制让TypeScript认为它符合原类的类型:

class WithProtected {
    protected property: number = 1
}

class Derived {
    property = 3
} as unknown as typeof WithProtected;

这种方式最简单,适合快速模拟,不需要修改类型定义。

方案2:模块扩展修改成员可见性

通过TypeScript的模块扩展特性,在模拟环境中将原类的protected属性转为public,这样就能正常用implements实现:

import type {} from 'cc';

// 扩展cc模块的类型定义,将protected属性改为public
declare module 'cc' {
    interface WithProtected {
        property: number;
    }
}

class Derived implements WithProtected {
    property = 3;
}

注意这个修改仅在当前项目的类型环境中生效,不会影响第三方库本身的代码。

方案3:自定义兼容接口+类型断言

先定义一个和原类结构兼容的public接口,实现这个接口后再断言为原类类型:

import type { WithProtected } from 'cc';

// 定义模拟用的兼容接口
interface MockWithProtected {
    property: number;
}

class Derived implements MockWithProtected {
    property = 3;
}

// 使用时断言为原类类型
const mockInstance = new Derived() as unknown as WithProtected;

这种方式更清晰,适合需要明确模拟结构的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:20:06