TypeScript Record類(lèi)型詳解
更新時(shí)間:2026-05-05 00:14:02
TypeScript 是類(lèi)型一種由微軟開(kāi)發(fā)的自由和開(kāi)源的編程語(yǔ)言,它是詳解 JavaScriヽ(′ー`)ノpt 的一個(gè)超集,擴展了 JavaScript 的類(lèi)型語(yǔ)法,TypeScrip??t 可以編譯成純 JavaScript,( ?ヮ?)詳(′_ゝ`)解可以在任何瀏覽器、類(lèi)型任何計算機和任何操作系統上運行,詳解在 TypeScript 中,類(lèi)型Record 類(lèi)型是詳解一種特殊的類(lèi)型,它允許你創(chuàng )建具有特定屬性名和類(lèi)型(′?_?`)的類(lèi)型對象。
Record 類(lèi)型是詳解 TypeScript 4.2 版本引入的一個(gè)新特性,它允許你使用一組已知的類(lèi)型屬性名和它們的類(lèi)型來(lái)創(chuàng )建一個(gè)新(xin)的對象類(lèi)型,Record 類(lèi)型可以讓你更簡(jiǎn)潔地表(?⊿?)示具有固定屬性的詳解對象,而不需要顯式地定義每(mei)個(gè)屬性的類(lèi)型類(lèi)型。
假設我們有一個(gè)具有兩個(gè)屬性 name 和 age 的詳解對象:
interface Person { na(′;ω;`)me: string; age: number;}const person: Person = { name: '張三', age: 30,};(′_`)使用 Record 類(lèi)型,我們可以簡(jiǎn)化這個(gè)對象的類(lèi)型定義:
ty(′?`)pe Person = Rec??ord<'na(′?`)me' | 'age', string | number>;const person: Person = { name: '張三', age: 30,};Record 類(lèi)型的基本用ヾ(?■_■)ノ法
Record 類(lèi)型的基本用法是將一組屬性名和它們的類(lèi)型用?? Record 關(guān)鍵字包裹起來(lái),屬性名可以是字符串字面量或符號,類(lèi)型可以是任何類(lèi)型,如果屬性名是一個(gè)字符串字面量,那么它的值必須是(′▽?zhuān)?字符串;如果屬性名是一個(gè)符號,那么它的值必須是該符號對應的類(lèi)型。
我們可以創(chuàng )建一個(gè)表示顏色的 Record 類(lèi)型:
type Color = Record<'red' | 'green' | 'blue', string>;const color: Color = { red:(???) '#FF0000??', green: '#008000', blue: '#0000FF',};(╯°□°)╯︵ ┻━┻在這個(gè)例子中,我們創(chuàng )建了一個(gè)名為 Color 的 Record 類(lèi)型,它有三個(gè)屬性:red(′?_?`)、green 和 blue,它們??的類(lèi)型都是字符串,然后我(wo)們創(chuàng )建了一個(gè) color 對象,它具有這三個(gè)屬性,并分別賦值?為紅色、綠色和藍色的十六進(jìn)制顏色代碼。
Record 類(lèi)型的高級用法
可選屬性
你可以使用問(wèn)號(?)來(lái)表示一(′▽?zhuān)?個(gè)可??選的屬性,這意味著(zhù)該屬性的值可以為 undefined。
type PersonOptional = Record<'name' | 'age' | 'gen(╯°□°)╯︵ ┻━┻der'?, st(′;д;`)ring | number | undefined>;const personOptional: Pers(′?_?`)on??Optional = { name: '張三', age: 30,};在這個(gè)例子中,我們創(chuàng )建了一個(gè)名為 PersonOptional 的 Record 類(lèi)型,它有三個(gè)屬性:name、ag( ?ヮ?)e 和可選的 gender,然后我們創(chuàng )建了一個(gè) personOptio(′?`)nal 對象,它具??有 name 和 age 屬性,但沒(méi)有 gender 屬性,注┐(′?`)┌意,這里的 gender 屬性值為 undefined。
只讀屬性
你ヾ(′▽?zhuān)??可以使用?? readonly='readonly' 關(guān)鍵字來(lái)表ヾ(′▽?zhuān)??示??一個(gè)只讀的屬性,這意味著(zhù)該屬性的值只能在對象初始化時(shí)設置??,之后不能被修改。
t??ype PersonReadonly = Record<'name' | 'age' | 'gender' | 'isStuヾ(^-^)ノdent' | 'isEmployee' | 'isTeacher', string | number | boolean>;const personReadonly: PersonReadonly = { name??: '張三', age: 30, gender: '男', isStudent: true, isEmployee: false, isTeacher: false,};在這個(gè)例子中,我們創(chuàng )建了一個(gè)名為(wei) PersonReadonly 的 Record 類(lèi)型,它有七個(gè)屬性:name、age、gender、isStudent、isEmployee、isTeacher,然后我們創(chuàng )建了一個(gè)?? personReadonly 對象,它具有這些屬性,并在(′_`)初始化時(shí)設置了它們的值,由于沒(méi)有使用 readonly="readonly" 關(guān)鍵字,所以這些屬性的值之后仍然可以被修改(gai),如果你嘗試修改這些屬性的值,TypeScript 編譯器會(huì )報錯,要創(chuàng )建一個(gè)真正的只讀對象,你需要使用 TypeScript 的 readonly='readonly'(????)<T> 類(lèi)型:ヾ(′▽?zhuān)??
const personReadonly: readonly="readonly"<PersonReadonly> = { ...personReadonly, isSt(′?ω?`)udent: false }; // Error! Property 'isStudent' is readonly="".在ヽ(′?`)ノ這個(gè)(ge)例子中,我們使用了 readonly<T> 類(lèi)型來(lái)創(chuàng )建一個(gè)真正的只讀對象,當我們嘗試修改 isStudent 屬性的值時(shí),TypeScript 編譯器會(huì )報錯,提示該屬(′?`)性是只(◎_◎;)讀的。

