You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
classSon{publicfirstName: string;privatelastName: string='Stark';constructor(firstName: string){this.firstName=firstName;this.lastName;// ok}}constson=newSon('Tony');console.log(son.firstName);// => "Tony"son.firstName='Jack';console.log(son.firstName);// => "Jack"console.log(son.lastName);// ts(2341) Property 'lastName' is private and only accessible within class 'Son'.
受保护的属性和方法,如下代码所示:
classSon{publicfirstName: string;protectedlastName: string='Stark';constructor(firstName: string){this.firstName=firstName;this.lastName;// ok}}classGrandSonextendsSon{constructor(firstName: string){super(firstName);}publicgetMyLastName(){returnthis.lastName;}}constgrandSon=newGrandSon('Tony');console.log(grandSon.getMyLastName());// => "Stark"grandSon.lastName;// ts(2445) Property 'lastName' is protected and only accessible within class 'Son' and its subclasses.
在前面的例子中,Son 类 public 修饰的属性既公开可见,又可以更改值,如果我们不希望类的属性被更改,则可以使用 readonly 只读修饰符声明类的属性,如下代码所示:
classSon{publicreadonlyfirstName: string;constructor(firstName: string){this.firstName=firstName;}}constson=newSon('Tony');son.firstName='Jack';// ts(2540) Cannot assign to 'firstName' because it is a read-only property.
classA{name: string;constructor(name: string){this.name=name;}}consta1: A={};// ts(2741) Property 'name' is missing in type '{}' but required in type 'A'.consta2: A={name: 'a2'};// ok
The text was updated successfully, but these errors were encountered:
TypeScript 中高效使用类型化的面向对象编程
类
在实际业务中,任何实体都可以被抽象为一个使用类表达的类似对象的数据结构,且这个数据结构既包含属性,又包含方法,比如:
继承
在 TypeScript 中,使用 extends 关键字就能很方便地定义类继承的抽象模式,如下代码所示:
公共、私有与受保护的修饰符
类属性和方法除了可以通过 extends 被继承之外,还可以通过修饰符控制可访问性。
在 TypeScript 中就支持 3 种访问修饰符,分别是 public、private、protected。
public
修饰的是在任何地方可见、公有的属性或方法;private
修饰的是仅在同一类中可见、私有的属性或方法;protected
修饰的是仅在类自身及子类中可见、受保护的属性或方法。受保护的属性和方法,如下代码所示:
只读修饰符
在前面的例子中,Son 类 public 修饰的属性既公开可见,又可以更改值,如果我们不希望类的属性被更改,则可以使用 readonly 只读修饰符声明类的属性,如下代码所示:
存取器
除了上边提到的修饰符之外,在 TypeScript 中还可以通过getter、setter截取对类成员的读写访问。
通过对类属性访问的截取,我们可以实现一些特定的访问控制逻辑。下面把之前的示例改造一下,如下代码所示:
静态属性
以上介绍的关于类的所有属性和方法,只有类在实例化时才会被初始化。实际上,我们也可以给类定义静态属性和方法。
因为这些属性存在于类这个特殊的对象上,而不是类的实例上,所以我们可以直接通过类访问静态属性,如下代码所示:
抽象类
接下来我们看看关于类的另外一个特性——抽象类,它是一种不能被实例化仅能被子类继承的特殊类。
我们可以使用抽象类定义派生类需要实现的属性和方法,同时也可以定义其他被继承的默认属性和方法,如下代码所示:
使用接口与使用抽象类相比,区别在于接口只能定义类成员的类型,如下代码所示:
类的类型
类的最后一个特性——类的类型和函数类似,即在声明类的时候,其实也同时声明了一个特殊的类型(确切地讲是一个接口类型),这个类型的名字就是类名,表示类实例的类型;在定义类的时候,我们声明的除构造函数外所有属性、方法的类型就是这个特殊类型的成员。如下代码所示:
The text was updated successfully, but these errors were encountered: