福田做網(wǎng)站seo關(guān)鍵詞優(yōu)化推廣報(bào)價(jià)表
typescript是js的超集,目前很多前端框架都開始使用它來作為項(xiàng)目的維護(hù)管理的工具,還在不斷地更新,添加新功能中,我們學(xué)習(xí)它,才能更好的在的項(xiàng)目中運(yùn)用它,發(fā)揮它的最大功效
//readonly 只能修飾屬性,不能修飾方法
//readonly修飾的屬性,必須手動(dòng)添加明確的類型,否則就是字面量類型
class Person {//只讀屬性readonly age:number = 18constructor(age:number) {this.age = age}//錯(cuò)誤展示// readonly setAge() {// // this.age = 20// }
}
//接口或者{}表示的對(duì)象類型,里面的屬性也是可以用readonly來修飾的
interface IPerson{readonly name:string
}let obj: IPerson = {name:'JACK'
}obj.name = 'rose'
//類型兼容性
//分為結(jié)構(gòu)化類型系統(tǒng)和標(biāo)明類型系統(tǒng)
//TS采用的是結(jié)構(gòu)化類型系統(tǒng),也叫duck typing(鴨子類型)
//類型檢查關(guān)注的是值所具有的形式
//也就是在結(jié)構(gòu)類型系統(tǒng)中,如果兩個(gè)類型對(duì)象具有相同的形狀,則認(rèn)為他們屬于同一類型
class Point {x: numbery:number
}class Point2D {x: numbery:number
}const p: Point = new Point2D()
//如果在表明類型系統(tǒng)中(c#,java)則兩個(gè)類型不是同的
class Point3D{x: numbery: numberz:number
}const p1: Point = new Point3D()
const p2: Point = new Point()//錯(cuò)誤演示
const p3: Point3D = new Point()
//Point3D 至少與Point相同,則Ponit兼容Point3D
//所以成員多的Ponit3D可以賦值給成員少的Ponit
//接口之間的兼容性,類似于class
//函數(shù)之間的兼容性比較復(fù)雜
//參數(shù)個(gè)數(shù),參數(shù)多的的兼容參數(shù)少的,即參數(shù)少的可以賦值給參數(shù)多的
//參數(shù)類型,相同位置的參數(shù)類型要相同(原始類型)或兼容(對(duì)象類型)
//返回值類型
type F1 = (a: number) => void
type F2 = (a: number, b: number) => voidlet f1: F1
let f2: F2 = f1//錯(cuò)誤演示,參數(shù)多的不能付給參數(shù)少的
let f3: F1 = f2//參數(shù)多的兼容少的,少的可以賦值給多的
const arr = [1,2,3,4,5]const a1 = arr.map((el) => el)const a2 = arr.map(() => console.log('1111111'))type F3 = (a: number) => string
type F4 = (a: number) => stringlet f4: F3
let f5:F4
f4 = f5
f5 = f4
//技巧:將對(duì)象拆開,把每個(gè)屬性看做一個(gè)個(gè)參數(shù),參數(shù)少的就可以賦值給參數(shù)多的
//返回值類型
//如果返回值類型是基本類型,相同則互相兼容
type F8 = () =>string
type F9 = () => stringlet f8: F8
let f9: F9 = f8
f8 = f9
//若果是對(duì)象類型,則成員多的可以賦值給少的
type F10 = () => {name:string}
type F11 = () => { name: string, age: number }let f10: F10
let f11: F11f10 = f11
//錯(cuò)誤演示
f11 = f10
//交叉類型
//類似于接口繼承,用于組合多個(gè)類型為一個(gè)類型(常用語對(duì)象類型)
//是新類型同時(shí)具備了多個(gè)類型的屬性類型
interface Person {name:string
}interface Age{age:number
}type IPerson = Person & Agelet obj: IPerson = {name: "GAOFENG",age: 20,
}type P = {name:string}
type A = { age: number }type C = P & Alet obj2: C = {name: 'gaogeng',age:30
}
//交叉類型和接口繼承的對(duì)比
//相同點(diǎn):都可以實(shí)現(xiàn)對(duì)象類型的組合
//不同點(diǎn):實(shí)現(xiàn)繼承時(shí),處理同名類型沖突的方式不一樣
//接口繼承會(huì)報(bào)錯(cuò),交叉類型沒有錯(cuò)誤
interface A1 {fn:(a:string) => string
}
interface B1 extends A1 {fn:(a:number) => string
}interface C1 {fn:(a:number) => string
}type C4 = A1 & C1let c: C4 = {fn(name:string|number) {// return name as stringreturn <string>name}
}
c.fn('task...')
c.fn(33333)