TypeScript面向对象
2022-12-07 本文已影响0人
我的袜子都是洞
TypeScript面向对象
readonly
单层修饰只读属性。
构造器
构造方法。
方法
Getters/Setters
类里面的特殊方法,称之为访问器。
同名的方法,不同的关键字修饰。
class C {
_length: number = 0
get length() {
return this._length
}
set length(value: number) {
this._length = value
}
}
部分特殊规则:
- 如果存在get,但没有set,则该属性自动是只读的。
- 如果没有制定setter参数的类型,它将从getter的返回类型中推断出来。
- 访问器和设置器必须有相同成员的可见性。
索引签名
class MyClass {
[s: string]: boolean | ((s: string) => boolean)
x = true
check(s: string) {
return this[s] as boolean
}
}
类的继承
implement子句
interface Pingable { // 接口
ping(): void
}
class Sonar implements Pingable { // 实现
ping() {
console.log("ping!")
}
}
可以实现多个接口,implements后面用逗号连接。
interface A {}
interface B {}
class C implements A, B {
}
extends子句
子类可获得父类所有方法。
class Animal { // 基类
// ...
}
class Dog extends Animal { // 派生类
// ...
}
初始化顺序
class Base {
name = "base"
constructor() {
console.log("My name is " + this.name)
}
}
class Derived extends Base {
name = "derived"
}
const d = new Derived()
顺序:
- 基类的字段被初始化
- 基类构造函数运行
- 派生类的字段被初始化
- 派生类构造函数运行
继承内置类型
编译的目标对象版本会影响运行结果,使用es6以上版本不必过于关心。
class MsgError extends Error {
constructor(s: string) {
super(s)
}
sayHello() {
return "hello " + this.message
}
}
类成员的可见性
- public: 公开的,默认值。任何对象在任何对方都可以访问。
- protected:受保护的。能在当前类或者子类中进行访问。
- private: 私有的。只能在当前类中进行访问。
类的静态成员
可以使用类名直接调用。
class MyClass {
static x = 0
static printX() {
console.log(MyClass.x)
}
}
注意:
特殊的静态名称不安全,避免使用:name,length,call等。
TypeScript没有静态类的概念,因为我们还有函数和普通对象。
static模块
class Foo {
static #count = 0
get count() {
return Foo.#count
}
static { // static块 ,访问性:私有的
Foo.#count += lastInstances.length
}
}