前篇:TypeScript學習(三)—— 類數組
父類定義一個方法不去實現,讓繼承它的子類去實現,每個子類有不一樣的表現。函數
class Animal {
name:string
constructor(name:string){
this.name = name
}
getVariety(){} //父類定義了getVariety方法不去實現
}
class Cat extends Animal{
constructor(name:string){
super(name)
}
getVariety():string{
return `${this.name}是隻貓!` //子類Cat對getVariety的實現
}
}
class Dog extends Animal{
constructor(name:string){
super(name)
}
getVariety():string{
return `${this.name}是隻狗!` //子類Dog對getVariety的實現
}
}
//這種子類繼承父類後重寫了getVariety方法,每一個子類有本身不一樣的實現,叫多態
複製代碼
TS中的抽象類是提供其餘類繼承的基類,不能直接實例化。用abstract關鍵字定義抽象類和抽象方法,抽象類中的抽象方法不包含具體實現而且必須在派生類中實現。post
抽象類和抽象方法用來定義標準,來約束子類必須實現指定方法學習
abstract class Animal {
name:string
constructor(name:string){
this.name = name
}
abstract getVariety():any
run():void{} //沒有abstract標識的方法在子類中能夠不實現
}
// const animal = new Animal() //報錯!!抽象類沒法實例化
class Dog extends Animal{
constructor(name:string){
super(name)
}
getVariety(){ //實現抽象方法中的getVariety方法,若是沒有則報錯!若是要標明返回值類型,必須和抽象方法中一致
return `${this.name}是隻狗!`
}
}
const dog = new Dog('旺財')
console.log(dog.getVariety()) //旺財是隻狗!
複製代碼
在OOP中,接口是一種規範的定義,它定義了行爲和動做的規範,在程序設計裏面,接口起到一種限制和規範的做用,接口定義了某一批類所須要遵照的規範,接口不關心這些類的內部裝藥數據,也不關係這些類裏方法的實現細節,它只規定這批類裏必須提供某些方法,提供這些方法就能夠知足實際須要。ui
使用interface關鍵字來定義:this
interface AnimalInfo{ //對傳入對象的約束
name:string
age:number
sex?:boolean
}
function Dog(info:AnimalInfo) { //info使用定義好的約束,要求傳進來的info必須知足AnimalInfo約定好的條件
console.log(`${info.name},${info.age}歲!`)
}
Dog({name:'mimi', age:2}) //不報錯
Dog({name:'mimi'}) //報錯
複製代碼
//函數類型接口:對方法傳入的參數以及返回值進行約束
interface encrypt {
(key:string,value:string):string //對函數進行約束
}
var md5:encrypt = function (key:string, value:string):string {
return key + value
}
md5('我是key', '我是value') //我是key我是value
md5('我是key') //報錯
複製代碼
//可索引接口:對數組、對象進行約束
interface userArry { //對數組約束
[index:number]:string
}
const arr:userArry = ['111122', '23333']
const arr:userArry = [123, '23333'] //報錯
interface userObj { //對對象進行約束
[index:string]:string //若是[index:string]:any,無論是Object或者是Arry都不會報錯
}
const obj:userObj = ['22','333'] //報錯
const obj:userObj = {a: '22', b: '333'} //不報錯
複製代碼
interface Animal { //定義類類型接口
name:string
getVariety():string
}
class Dog implements Animal{ //對Dog類添加約束,使用implements關鍵字,Dog中必須有name屬性和getVariety方法
name:string
constructor(name:string){
this.name = name
}
getVariety(): string {
return `${this.name}是隻狗!`
}
}
const dog = new Dog('旺財')
複製代碼
類類型接口和前面的抽象類類似,都是要求子類按照約定好的標準去具體實現。spa
interface Dog extends Animal{
say():void
}
class NorthDog {
unClod():void{
console.log('北極狗不怕冷!')
}
}
class Husky extends NorthDog implements Dog{ //繼承+接口
name:string
constructor(name){
super()
this.name = name
}
getVariety(): string {
return `${this.name}是隻狗!`
}
say(): void {
console.log('汪汪!!!')
}
}
const husky = new Husky('二哈')
husky.unClod()
複製代碼
泛型是解決類、接口、方法的複用以及對不特定數據類型的支持。設計
泛型能夠支持不特定數據類型,要求傳入參數和返回的參數一致。code
function getDate<T>(value:T):T { //T由調用這個方法的時候決定
return value
}
getDate<number>(123) //正確
getDate<string>(123) //要求傳入string 報錯
複製代碼
class List<T>{
list:T[]
constructor(...list:T[]){
this.list = list
}
add(item:T):void{
this.list.push(item)
}
getList():T[]{
return this.list
}
}
const numList = new List<number>(1,2,3)
const stringList = new List<string>()
numList.add(8) //正確
stringList.add('a') //正確
console.log(numList.getList()) // [ 1, 2, 3, 8 ]
console.log(stringList.getList()) // [ 'a' ]
numList.add('a') //報錯
stringList.add(1) //報錯
複製代碼
interface Config<T> { //定義泛型接口
name:T
getName():T
}
class Dog<T> implements Config<T>{ //定義泛型類
name:T
constructor(name:T){
this.name = name
}
getName(): T {
return this.name
}
}
const dog = new Dog<string>('旺財!')
console.log(dog.getName())
const dog = new Dog<string>(11) //報錯!
複製代碼