發(fā)現(xiàn)看完了文檔還是不會(huì)寫,別人寫的代碼又看不懂,找了篇文檔看:https://blog.csdn.net/weixin_39843414/article/details/105108806
總結(jié)一下:
interface和type
- 都是類型的聲明,不同點(diǎn)在于,interface只能用來表示object,function,class三種類型,重名可以自動(dòng)聚合,而type還支持其他的類型,type不能同名,也就意味著不能進(jìn)行聚合,繼承需要重新定義type,支持復(fù)雜的類型操作,當(dāng)然,interface和type并不互斥,都可以互相繼承
- 注意類和接口都被視為靜態(tài)藍(lán)圖,因此,他們不能實(shí)現(xiàn)/繼承
聯(lián)合類型的 type,implements關(guān)鍵字用于類和接口表示對(duì)接口的繼承和實(shí)現(xiàn)
// type可以表示更多類型,可以使用計(jì)算
type Name = string;
type PartialPointX = {x:number;};
type PartialPointY = {y:number;};
type PartialPoint = PartialPointX | PartialPointY;
type Data = [number,string,boolean];
// type繼承interface
interface particalPerson {name: 'liming'}
type person = name & {age: 18}
// interface繼承 type
type particalPerson = {name: 'liming'}
interface person extends particalPerson {age: 18}
// implements
interface Point {x: number, y:number}
class somePoint implements Point {x: 1, y: 2}
//error 聯(lián)合類型無法被類實(shí)現(xiàn)
type Point2 = {x: number} | {y:number}
class somePoint2 implement Points {x: 1, y:2}
extends
- 擴(kuò)展,繼承,可以對(duì)已有的類型進(jìn)行擴(kuò)展,也可以對(duì)類型進(jìn)行條件的限定,判斷是否繼承于某個(gè)接口
type isEuqalType<A, B> = A extends B ? (B extends A ? true : false) : false
typeof
- 注意與js中的語法是不一樣的 重復(fù)的關(guān)鍵字名稱
- typeof 引用類型操作符,將任何可以在編譯時(shí)確定的變量的類型,轉(zhuǎn)化為可以在類型系統(tǒng)中的類型
假設(shè)T是一個(gè)類型,那么typeof T 將得到類型的聯(lián)合類型的表示
interface Izip {name: '', age: 12, class: 1}
type ant = typeof Izip // ant=name | age | calss
泛型
- 泛型就是不預(yù)先確定數(shù)據(jù)類型,而是在使用時(shí)再確定的一種類型約束規(guī)范。
- 傳入函數(shù)時(shí)的泛型可以理解為函數(shù)的參數(shù),代表類型而不是代表值
- 可以通過extends進(jìn)行類型的約束,示例代碼:
function plunk<T, K extends typeof T>(o: T, name: K[]): T[K][] {
return name.map(n =>o(n))
}
interface Point = {name: string, age: number}
let person: Point = {name: 'liming', age: 10}
let result: string[] = plunk(person, ['name', 'name', 'name']) // 輸出 ['liming', 'liming', 'liming']
- 傳入類型的定義,K為T的類型的聯(lián)合表示,name為K的數(shù)組
- 返回值的類型,是由T的內(nèi)部的類型的值組成的數(shù)組
工具函數(shù)
- infer 在extends條件語句中表示待推斷的類型變量
- Partial 將選入的屬性變?yōu)榭蛇x項(xiàng)
type Partial<T> = <P in keyof T?: T[P]>
- Required 將傳入的屬性變成必選項(xiàng)
type Required<T> = <P in keyof T-?: T[P]>
- Readonly 將傳入的屬性變?yōu)榭勺x的
type Readonly<T> = <readonly [P in keyof T]: T[P]>
- Record<T, K> 將傳入的K的屬性的值都賦值為T類型
type Record<K extends keyof any, T> = {<P in K: T>}
- Extract<T, K> 將T中的K的屬性都獲取出來
type Extract<T, K> =< T extends K?T : never>
- Exclude<T, K> 將T中的K的屬性都剔除出去
type Exclude<T, K> = <T extends K? never: T>
- Pick<T, K> 將T中的K的屬性和值都獲取出來
type Pick<T, K extends keyof T> = {P in K: T[P]}
- Omit<T, K> 將T中的K的屬性值都剔除出去
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>