protected 修饰符仅在 typescript 编译时限制访问:允许类自身及子类内部通过 this 或 super 调用,禁止实例对象直接访问(如 instance.method())和无关类调用。

protected 修饰符通过编译时检查实现访问限制,它不改变运行时行为,只在 TypeScript 类型检查阶段禁止外部直接调用。
protected 方法的可访问范围
被 protected 修饰的方法:
- 可以在定义它的类内部(包括构造函数、其他实例方法)中通过
this调用 - 可以在继承该类的子类内部通过
this或super调用(super仅限于调用父类的protected方法,不能用于访问protected属性) - 不能在类的实例对象上直接访问,比如
instance.protectedMethod()会报类型错误 - 不能在非继承关系的其他类或函数中通过任何方式调用(即使使用
any绕过也会失去类型安全)
实际写法与典型报错
例如:
class Animal {
protected speak() {
return 'Sound';
}
}
class Dog extends Animal {
bark() {
return this.speak() + '!'; // ✅ 合法:子类内部通过 this 访问
}
}
const dog = new Dog();
// dog.speak(); // ❌ 编译报错:Property 'speak' is protected and only accessible within class 'Animal' and its subclasses.
注意:即使代码在浏览器中能执行(因为 JS 没有运行时保护),TypeScript 编译器仍会拒绝生成含此类非法访问的代码(除非关闭严格检查)。
和 public / private 的关键区别
-
public:允许instance.method()、类内、子类内任意调用 -
private:仅限本类内部,子类也不行(哪怕名字相同也是独立私有成员) -
protected:本类 + 子类 ✅,实例对象 ❌,无关类 ❌
常见误用提醒
以下写法均不合法:
-
super.speak()在子类中调用父类protected方法是允许的,但super.speak单独取值(不加括号)会报错——因为super不支持读取protected成员,只支持调用方法 - 用
as any强转后调用,虽能绕过类型检查,但破坏封装意图,不推荐 - 在静态方法中用
this访问实例的protected方法——静态上下文没有实例this,无法访问











