類
class Person {
// 私有變量
private name: string;
// 構(gòu)造函數(shù)
constructor(name: string) {
this.name = name;
}
// 獲取名字
getName(): string {
return this.name;
}
// 設(shè)置名字
setName(name: string): void {
this.name = name;
}
}
let p = new Person("張三");
p.setName("李四");
console.log(p);
繼承
class Son extends Person {
// 靜態(tài)屬性
public static age: number = 18;
// 學校
public school: string;
//構(gòu)造方法
constructor(name: string, school: string) {
// 訪問派生類的構(gòu)造函數(shù)中的 "this" 前,必須調(diào)用 "super",初始化父類構(gòu)造函數(shù) --并把參數(shù)傳給父類
super(name);
//把傳進來的school賦值給全局變量
this.school = school;
}
//靜態(tài)方法
static run(name: string): string {
return `${name}在跑步,他的年齡才${this.age}`;
}
}
let son = new Son("王五", "清華大學");
son.setName("趙六"); // 私有類也不能在子類的外部訪問,但可通過公開的方法中進行賦值和訪問
console.log(son);
console.log(Son.run("方七"));
console.log(Son.age);
tips:
1.public 在當前類里面窃躲,子類钦睡,類外面都可以訪問
2.protected 在當前類和子類內(nèi)部可以訪問,類外部無法訪問
3.private 在當前類內(nèi)部可訪問洒琢,子類,類外部都無法訪問象迎。
4.屬性不加修飾符,默認就是公有的 (public)
多態(tài)
通過抽象方法/方法重載–實現(xiàn)多態(tài)–多態(tài)的作用是用來定義標準
// 抽象父類
abstract class Animal {
private name: string;
constructor(name: string) {
this.name = name;
}
//抽象成員--方法
abstract eat(): any;
//抽象成員--屬性
protected abstract ages: Number;
sleep(): void {
console.log("睡覺");
}
}
class cat extends Animal {
ages: Number = 2;
constructor(name: string) {
super(name);
}
//非抽象類“cat”不會自動實現(xiàn)繼承自“Animal”類的抽象成員“eat”, 必須手動定義父類中的抽象方法--多態(tài)
eat(): string {
return "貓吃魚";
}
//多態(tài)
sleep(): string {
return "貓在睡覺";
}
}
console.log(new cat("33").sleep());
tips:
1.抽象類無法實例化呛踊。
2.非抽象類繼承抽象父類時不會自動實現(xiàn)來自父類的抽象成員,必須手動定義父類中的抽象成員谭网,否則報錯。
3.抽象成員包括屬性和方法
接口
在面向?qū)ο蟮木幊讨杏湓瘢涌谑且环N規(guī)范的定義,它定義了行為和動作的規(guī)范要拂,
在程序設(shè)計里面站楚,接口起到一種限制和規(guī)范的作用。
接口定義了某一批類所需要遵守的規(guī)范拉一,接口不關(guān)心這些類的內(nèi)部狀態(tài)數(shù)據(jù)旧乞,也不關(guān)心這些類里方法的實現(xiàn)細節(jié),它只規(guī)定這批類里必須提供某些方法嫡纠,提供這些方法的類就可以滿足實際需要延赌。ts中的接口類似于java,同時還增加了更靈活的接口類型者蠕,包括屬性掐松、函數(shù)粪小、可索引和類等抡句。
屬性接口
interface InterfaceName {
first: string;
second?: string; //加個問號,接口屬性就可以變成可傳可不傳了,不傳默認是undefined殴蹄。
}
//打印變量
function logParam(name: InterfaceName): void {
console.log(name.first, name.second, 11);
}
//定義參數(shù)
const obj = { first: "1", second: "fff", three: 1 };
//logParam({ first: "1", second: "1", three: 1 }); //報錯,只能傳接口定義的值
logParam(obj);
tips: 用個變量來存儲傳入的變量,這樣可以傳入定義的接口以外的值袭灯,否則如果直接傳入對象中無接口定義的值會報錯,所以建議接口定義了哪些值就傳哪些值橘茉。
函數(shù)類型接口
對方法傳入的參數(shù)類型,以及返回值類型進行約束,可批量進行約束姨丈。
interface keyMap {
(key: string, value: string): string;
}
let logKeyMap: keyMap = function (key1: string, value: string): string {
return key1 + value;
};
console.log(logKeyMap("key1", "value"));
tips: 接口只對傳入的參數(shù)的類型和參數(shù)的個數(shù)進行約束,不對參數(shù)名稱進行約束翁潘。
可索引接口
- 約束數(shù)組
interface Arr {
[index: number]: string;
}
let ss: Arr = ["2121"];
- 約束對象
interface Obj {
[index: string]: string;
}
let interfaceArr: Obj = { aa: "1" };
tips:
1.對數(shù)組進行約束,index后必須跟著number類型歼争。
2.對對象進行約束,index后必須跟著string類型
3.索引簽名參數(shù)類型必須為 “string” 或 “number”
類類型接口
- 對類進行約束,類似抽象類的實現(xiàn)。
interface Animals {
name: string;
eat(): void;
}
class Dogs implements Animals {
name: string;
constructor(name: string) {
this.name = name;
}
eat() {}
}
- 接口繼承–接口可以繼承接口
interface Dog {
eat(): void;
}
interface Persons extends Dog {
work(): void;
}
class Cat {
code() {
console.log("貓在敲代碼");
}
}
//可繼承類后再實現(xiàn)接口
class SuperMan extends Cat implements Persons {
eat(): void {
console.log(1);
}
work(): void {
console.log(2);
}
}
let superMan = new SuperMan();
superMan.code();
tips: 類接口會對類的屬性和方法進行約束,類似非抽象類繼承抽象類時必須實現(xiàn)某些方法和屬性乔遮,但對屬性和方法的類型的約束更加嚴格,除了方法void類型可被重新定義外瞒津,其他屬性或方法的類型定義需要和接口保持一致括尸。