TypeScript基礎(chǔ)入門之高級類型的索引類型(Index types)

轉(zhuǎn)發(fā) # TypeScript基礎(chǔ)入門之高級類型的索引類型(Index types)

高級類型

索引類型(Index types)

使用索引類型,編譯器就能夠檢查使用了動態(tài)屬性名的代碼远搪。 例如永毅,一個常見的JavaScript模式是從對象中選取屬性的子集。

function pluck(o, names) {
    return names.map(n => o[n]);
}

下面是如何在TypeScript里使用此函數(shù)丧没,通過 索引類型查詢和 索引訪問操作符:

function pluck<T, K extends keyof T>(o:T, names: K[]): T[K][] {
  return names.map(n => o[n])
}

interface Interface1 {
  name: string;
  age: number;
}

let i: Interface1 = {
  name: "A",
  age: 1,
}

let pluckStr: string[] = pluck(i, ['name'])
console.log(pluckStr)

運行后輸出如下

[ 'A' ]

編譯器會檢查 name是否真的是Interface1的一個屬性鹰椒。 本例還引入了幾個新的類型操作符。 首先是 keyof T呕童, 索引類型查詢操作符漆际。 對于任何類型 T, keyof T的結(jié)果為 T上已知的公共屬性名的聯(lián)合夺饲。 例如:

let someProps: keyof Interface1; // 'name' | 'age'

keyof Interface1是完全可以與'name'|'age'互相替換的奸汇。 不同的是如果你添加了其它的屬性到Interface1,例如address: string往声,那么 keyof Interface1會自動變?yōu)?name'|'age'|'address'擂找。 你可以在像pluck函數(shù)這類上下文里使用 keyof,因為在使用之前你并不清楚可能出現(xiàn)的屬性名浩销。 但編譯器會檢查你是否傳入了正確的屬性名給 pluck:

pluck(i, ['age', 'unknown']); // error, 'unknown' is not in 'name' | 'age'

第二個操作符是T[K]贯涎,索引訪問操作符。 在這里慢洋,類型語法反映了表達式語法塘雳。 這意味著 i['name']具有類型Interface1['name'] — 在我們的例子里則為string類型。 然而且警,就像索引類型查詢一樣粉捻,你可以在普通的上下文里使用 T[K],這正是它的強大所在斑芜。 你只要確保類型變量 K extends keyof T就可以了肩刃。 例如下面 getProperty函數(shù)的例子:

function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
    return o[name]; // o[name] is of type T[K]
}

getProperty里的 o: T和 name: K,意味著 o[name]: T[K]杏头。 當(dāng)你返回 T[K]的結(jié)果盈包,編譯器會實例化鍵的真實類型,因此 getProperty的返回值類型會隨著你需要的屬性改變醇王。

let name: string = getProperty(i, 'name');
let age: number = getProperty(i, 'age');
let unknown = getProperty(i, 'unknown'); // error, 'unknown' is not in 'name' | 'age'

索引類型和字符串索引簽名

keyof和T[K]與字符串索引簽名進行交互呢燥。如果你有一個帶有字符串索引簽名的類型,那么 keyof T會是 string寓娩。并且T[string]為索引簽名的類型:

interface Map<T> {
    [key: string]: T;
}
let keys: keyof Map<number>; // string
let value: Map<number>['foo']; // number
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叛氨,一起剝皮案震驚了整個濱河市呼渣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寞埠,老刑警劉巖屁置,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仁连,居然都是意外死亡蓝角,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門饭冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來使鹅,“玉大人,你說我怎么就攤上這事昌抠』贾欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵扰魂,是天一觀的道長麦乞。 經(jīng)常有香客問我,道長劝评,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任倦淀,我火速辦了婚禮蒋畜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撞叽。我一直安慰自己姻成,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布愿棋。 她就那樣靜靜地躺著科展,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糠雨。 梳的紋絲不亂的頭發(fā)上才睹,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音甘邀,去河邊找鬼琅攘。 笑死,一個胖子當(dāng)著我的面吹牛松邪,可吹牛的內(nèi)容都是我干的坞琴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逗抑,長吁一口氣:“原來是場噩夢啊……” “哼剧辐!你這毒婦竟也來了寒亥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荧关,失蹤者是張志新(化名)和其女友劉穎溉奕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羞酗,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡腐宋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了檀轨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胸竞。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖参萄,靈堂內(nèi)的尸體忽然破棺而出卫枝,到底是詐尸還是另有隱情,我是刑警寧澤讹挎,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布校赤,位于F島的核電站,受9級特大地震影響筒溃,放射性物質(zhì)發(fā)生泄漏马篮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一怜奖、第九天 我趴在偏房一處隱蔽的房頂上張望浑测。 院中可真熱鬧,春花似錦歪玲、人聲如沸迁央。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岖圈。三九已至,卻和暖如春钙皮,著一層夾襖步出監(jiān)牢的瞬間蜂科,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工株灸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崇摄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓慌烧,卻偏偏與公主長得像逐抑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屹蚊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容