您好,登錄后才能下訂單哦!
這篇文章主要介紹了typescript如何使用映射類型,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在了解映射類型之前,需要了解 keyof, never, typeof, in。
keyof:keyof 取 interface 的鍵
interface Point { x: number; y: number; } // type keys = "x" | "y" type keys = keyof Point;
never:永遠不存在的值的類型
官方描述:
the never type represents the type of values that never occur.
// 例子:進行編譯時的全面的檢查 type Foo = string | number; function controlFlowAnalysisWithNever(foo: Foo) { if (typeof foo === "string") { // 這里 foo 被收窄為 string 類型 } else if (typeof foo === "number") { // 這里 foo 被收窄為 number 類型 } else { // foo 在這里是 never const check: never = foo; } }
使用 never 避免出現新增了聯合類型沒有對應的實現,目的就是寫出類型絕對安全的代碼。
typeof:取某個值的 type
const a: number = 3 // 相當于: const b: number = 4 const b: typeof a = 4
in:檢查一個對象上是否存在一個屬性
interface A { x: number; } interface B { y: string; } function doStuff(q: A | B) { if ('x' in q) { // q: A } else { // q: B } }
映射類型就是將一個類型映射成另外一個類型,簡單理解就是新類型以相同的形式去轉換舊類型的每個屬性。
Partial 將每個屬性轉換為可選屬性
Readonly 將每個屬性轉換為只讀屬性
Nullable 轉換為舊類型和null的聯合類型
Required 將每個屬性轉換為必選屬性
type Partial<T> = { [P in keyof T]?: T[P]; } type Readonly<T> = { readonly [P in keyof T]: T[P]; } type Nullable<T> = { [P in keyof T]: T[P] | null } type Required<T> = { [P in keyof T]-?: T[P] } interface Person { name: string; age: number; } type PersonPartial = Partial<Person>; type PersonReadonly = Readonly<Person>; type PersonNullable = Nullable<Person>; type PersonPartial = { name?: string | undefined; age?: number | undefined; } type PersonReadonly = { readonly name: string; readonly age: number; } type PersonNullable = { name: string | null; age: number | null; } interface Props { a?: number; b?: string; } const obj: Props = { a: 5 }; const obj2: Required<Props> = { a: 5 }; // Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.
Pick 選取一組屬性指定新類型
Record 創建一組屬性指定新類型,常用來聲明普通Object對象
type Pick<T, K extends keyof T> = { [P in K]: T[P]; } type Record<K extends keyof any, T> = { [P in K]: T; } interface Todo { title: string; description: string; completed: boolean; } type TodoPreview = Pick<Todo, "title" | "completed">; const todo: TodoPreview = { title: "Clean room", completed: false, }; todo; // = const todo: TodoPreview interface PageInfo { title: string; } type Page = "home" | "about" | "contact"; const nav: Record<Page, PageInfo> = { about: { title: "title1" }, contact: { title: "title2" }, home: { title: "title3" }, }; nav.about; // = const nav: Record
Exclude 去除交集,返回剩余的部分
Omit 適用于鍵值對對象的Exclude,去除類型中包含的鍵值對
type Exclude<T, U> = T extends U ? never : T type Omit = Pick<T, Exclude<keyof T, K>> // 相當于: type A = 'a' type A = Exclude<'x' | 'a', 'x' | 'y' | 'z'> interface Todo { title: string; description: string; completed: boolean; } type TodoPreview = Omit<Todo, "description">; const todo: TodoPreview = { title: "a", completed: false, };
獲取返回值類型,一般為函數
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any; declare function f1(): { a: number; b: string }; type T1 = ReturnType<typeof f1>; // type T1 = { // a: number; // b: string; // }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“typescript如何使用映射類型”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。