發(fā)現(xiàn)看完了文檔還是不會寫,別人寫的代碼又看不懂,找了篇文檔看:https://blog.csdn.net/weixin_39843414/article/details/105108806
總結(jié)一下:
interface和type
- 都是類型的聲明,不同點在于,interface只能用來表示object,function,class三種類型,重名可以自動聚合,而type還支持其他的類型,type不能同名,也就意味著不能進行聚合,繼承需要重新定義type,支持復(fù)雜的類型操作,當然,interface和type并不互斥,都可以互相繼承
- 注意類和接口都被視為靜態(tài)藍圖,因此,他們不能實現(xiàn)/繼承
聯(lián)合類型的 type,implements關(guān)鍵字用于類和接口表示對接口的繼承和實現(xiàn)
// type可以表示更多類型,可以使用計算
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)合類型無法被類實現(xiàn)
type Point2 = {x: number} | {y:number}
class somePoint2 implement Points {x: 1, y:2}
extends
- 擴展,繼承,可以對已有的類型進行擴展,也可以對類型進行條件的限定,判斷是否繼承于某個接口
type isEuqalType<A, B> = A extends B ? (B extends A ? true : false) : false
typeof
- 注意與js中的語法是不一樣的 重復(fù)的關(guān)鍵字名稱
- typeof 引用類型操作符,將任何可以在編譯時確定的變量的類型,轉(zhuǎn)化為可以在類型系統(tǒng)中的類型
假設(shè)T是一個類型,那么typeof T 將得到類型的聯(lián)合類型的表示
interface Izip {name: '', age: 12, class: 1}
type ant = typeof Izip // ant=name | age | calss
泛型
- 泛型就是不預(yù)先確定數(shù)據(jù)類型,而是在使用時再確定的一種類型約束規(guī)范。
- 傳入函數(shù)時的泛型可以理解為函數(shù)的參數(shù),代表類型而不是代表值
- 可以通過extends進行類型的約束,示例代碼:
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項
type Partial<T> = <P in keyof T?: T[P]>
- Required 將傳入的屬性變成必選項
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>>