親切
calss A {
name: string
constructor(name:string) {
this.name = name}
greet() {
return 'hello,' + this.name}
}
let people = new A('RenNing')
継承する
サブクラスは one で派生类
、extends キーワードを通じて親クラス (基本クラス) から派生します。
派生クラスはサブクラスと呼ばれることが多く、基本クラスはスーパークラスと呼ばれることがよくあります。
派生クラスには、呼び出す必要があるコンストラクターが含まれています。super()
public、private、protected 修飾子
公共
ts のメンバーはデフォルトでパブリックです
プライベート
自分のクラスへの外部アクセスを宣言できなくなりました
サブクラスはプライベートにアクセスできません
class Animal {
private name: string;
constructor(thenname: string) {
this.name = theName}
}
new Animal('cat').name //报错
保護された
保護されたメンバーには派生クラスでアクセスできる
コンストラクター (constructor) が保護済みとしてマークされると、クラスはインスタンス化できなくなりますが、継承することはできます。
class A{
protected constructor() {
}
}
class B extends A {
}
let a = new A() //错误-A的构造函数时被保护的
let b = new B() //ok
読み取り専用修飾子
readonly キーワードは、プロパティを読み取り専用に設定します。読み取り専用プロパティは、宣言時にコンストラクター内で初期化する必要があります。
class A {
readonly name: string;
readonly age: number = 18
}
(new A()).name = 1 //报错
パラメータのプロパティ
パラメーター属性は、メンバーを 1 か所で定義および初期化するのに便利です。
上記の例を変更した後
class A {
constructor(readonly name: string, readonly age: number) {
}
say() {
console.log(this.name,this.age)}
}
let a = new A('Ren', 18)
a.say() //Ren 18
宣言と代入を 1 か所にまとめます
アクセサ
ts は、オブジェクト メンバーへのアクセスがゲッター/セッターを通じてインターセプトされることを指摘しています。
let passcode = 'searet passcode'
class Employee {
private _fullName: string;
get fullName() :string {
return this._fullName
}
set fullName(newValue: string) {
if(passcode && passcode == 'secret passcode') {
this._fullName = newValue
}else {
console.log('Error Unauthorized update of employee')
}
}
}
let employee = new Employee()
のみを持つアクセサーget
と持たないset
アクセサーは、自動的に として推論されますreadonly
。
静的プロパティ
使用static
法定義
class A {
static name: string = 'RenNing'
}
console.log(A.name)//RenNing
抽象クラスの抽象
他の派生クラスの基底クラスとして使用されるため、インスタンス化されず、抽象クラスと抽象メソッドを定義できます。
abstract class A {
abstract makeSound(): void;
move: void {
console.log('roamin the earch...')}
}
抽象クラスの抽象メソッドには具体的な実装が含まれていないため、クラスから派生する必要があります。
インターフェイス メソッドと同様に、メソッド シグネチャのみが定義され、メソッド本体は含まれません。抽象にはアクセス修飾子を含めることができます
abstract class A {
abstract say() :void//必须在派生类中实现
sing(){
console.log('sing-A')}
}
class B extends A {
say():void{
console.log('say-B')}
song() :void {
console.log('song-B')}
}
let point: A
point = new A()//错误:不能实例化抽象类
point = new B()
point.say()say-B
point.song()//错误:方法再声明抽象类中不存在
let point: B
point = new B()
point.say()//say-B
point.song()//song-B
point.sing()//sing-A
高度なヒント
クラス型 **クラス名の型を取得します。この型には、クラスのすべての静的メンバーとコンストラクターが含まれます。
class A {
static name: string = "Ren"
age: number = 18
}
let aMaker: type A = A
console.log(A.name)//Ren
let b: A = new A()
console.log(b.age)//18
console.log(typeof A)// function
クラスをインターフェースとして使用する
クラス定義では、クラスのインスタンス型とコンストラクターという 2 つのものが作成されます。
class A {
x: number;y:number}
interface Point3d extends Point {
z: number}
let point3d: Point2d = {
x: 1, y: 2, z: 3}
直接インスタンス化することはできません
インターフェース継承クラス
コンストラクターは保護されたものによって変更されます
抽象クラス