// 1.類的屬性和方法
class Dog {
name: string = "旺財";
age: number = 2;
shout() {
console.log("汪汪汪")
}
}
let dog = new Dog()
// 2.類的建構函式(用於給類中的屬性設定初始值,在建立類的例項時會被觸發)
class Cat {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name; //this指的是此類的例項
this.age = age;
}
shout() {
console.log("喵喵喵")
}
}
let cat = new Cat("咪咪", 3)
// 3.類的繼承
// 開發時可能存在類之間有許多共用的屬性和方法,這個時候就需要一個父類把這些方法提取出來用於子類的繼承
class Animal {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
shout() {
console.log("動物的叫聲")
}
}
class Bird extends Animal {
skill: string;
constructor(name: string, age: number, skill: string) {
super(name, age) //super指的是該類的父類,當需要新增新的屬性是,需要重寫建構函式,這個時候就需要執行super,相當於把父類的建構函式執行一遍
this.skill = skill
}
shout() {
console.log("啾啾啾") //重寫父類中的shout函式
}
}
let bird = new Bird("小紅", 2, "飛翔");
// 4.抽象類(有時候我們不希望用於繼承的父類能建立例項,只能用於繼承,這個時候就需要抽象類)
abstract class Food { //在該類前加上abstract,該類就會變成抽象類,不能建立例項
name: string;
colour: string;
constructor(name: string, colour: string) {
this.name = name;
this.colour = colour;
}
}
// 5.介面(用來定義一個類或者物件的結構)
interface myInterface {
name: string;
age: number
}
let obj: myInterface = {
name: "琳琳",
age: 15
}
interface myInter {
name: string;
sayHello(): void;
}
class myClass implements myInter {
name: string;
constructor(name: string) {
this.name = name
}
sayHello() {
console.log("myInter介面的實現")
}
}
// 6.屬性封裝
// 屬性修飾符有三種 public,private,protected。不寫修飾符的情況下預設為 public
// private 說明該屬性為該所在類私有,只有在該類中才能被訪問,無論是繼承還是建立例項都不能被訪問
// protected 修飾符設定的屬性只能在當前類和繼承當前類的子類中使用
// 屬性為私有後外部就不能隨便修改該屬性,這個時候我們需要設定相應的getter和setter方法來獲取和修改屬性,這樣可以將屬性的修改控制在可控範圍
class Person {
// private name:string;
// private age:number
constructor(private _name: string, private _age: number) { //ts語法糖,可以簡化屬性和建構函式
// this.name = name
// this.age = age
}
// 類的getter和setter方法
// getName(){
// return this.name
// }
// setName(value:string){
// this.name = value
// }
// getAge(){
// return this.age
// }
// setAge(value:number){
// this.age = value
// }
// TS的getter和setter方法有簡寫
get name() {
return this._name
}
set name(value: string) {
this._name = value
}
get age() {
return this._age
}
set age(value: number) {
this._age = value
}
sayHello() {
console.log("你好")
console.log(`我的名字是${this.name}`)
}
}
let person = new Person("小明", 15)
// console.log(person.getName()) // 獲取person物件的名字
// person.setName("小華") // 修改物件的名字
console.log(person.name) // 獲取person物件的名字
person.name = "小華" // 修改物件名稱
// 7.泛型(有些情況下我們並不知道所有引數和返回的型別,這個時候就需要泛型)
// 定義函式泛型
function fn<T>(name: T): T { // 這表示該函式定義了一個泛型為T,name的型別也是泛型T,返回值的型別也為泛型T
return name
}
fn(10); // 不指定泛型,TS會自動推測出泛型為number
fn<string>("你好世界"); // 指定泛型為string
// 泛型可以指定多個
function fn2<T, K>(name: T, age: K): T {
return name
}
fn2("小明", 12)
fn2<string, number>("小明", 12)
// 泛型不只是string,number之類的,也可以是介面的實現
interface Inter{
length:number
}
function fn3<T extends Inter>(a:T):number{
return a.length
}
fn3([1,23,4])
// 定義類的泛型
class myClass2<T>{
constructor(private _name:T){}
get name(){
return this._name
}
set name(value:T){
this._name = value
}
}