TypeScript中索引簽名的實(shí)現(xiàn)示例
1. 基本語法
索引簽名的基本語法如下:
interface SomeObject {
[key: string]: string;
}
在上面的例子中,[key: string] 表示這個(gè)對(duì)象可以有任意數(shù)量的字符串類型的鍵,而每個(gè)鍵對(duì)應(yīng)的值都是 string 類型。
在使用apiFox對(duì)接接口時(shí),經(jīng)常會(huì)自動(dòng)生成類型:如圖

項(xiàng)目中的一些場(chǎng)景:

2. 使用索引簽名
2.1 定義一個(gè)對(duì)象類型,允許使用字符串鍵名
interface Dictionary {
[key: string]: number;
}
const dict: Dictionary = {
age: 30,
height: 175
};
console.log(dict["age"]); // 輸出: 30
console.log(dict["height"]); // 輸出: 175
在這個(gè)例子中,Dictionary 類型允許我們使用任意的字符串作為鍵,并且每個(gè)鍵對(duì)應(yīng)的值都是 number 類型。
2.2 字符串或數(shù)字作為索引類型
你可以指定索引的鍵可以是 字符串 或 數(shù)字,但你不能同時(shí)指定這兩種類型。如果你同時(shí)使用字符串和數(shù)字,TypeScript 會(huì)做一定的類型推導(dǎo)。
interface MixedDictionary {
[key: string]: number;
[index: number]: number; // 字符串索引與數(shù)字索引共享相同的值類型
}
const dict: MixedDictionary = {
age: 25,
100: 500,
height: 175
};
console.log(dict["age"]); // 輸出: 25
console.log(dict[100]); // 輸出: 500
3. 限制鍵的類型
你可以使用 字面量類型 限制對(duì)象的索引簽名的鍵類型。例如,限制對(duì)象的鍵為 'a'、'b' 或 'c':
interface MyObject {
[key: "a" | "b" | "c"]: number;
}
const obj: MyObject = {
a: 1,
b: 2,
c: 3
};
console.log(obj.a); // 輸出: 1
在這個(gè)例子中,MyObject 只允許 a、b 和 c 作為鍵。鍵名之外的任何值都會(huì)導(dǎo)致編譯錯(cuò)誤。
4. 只讀索引簽名
有時(shí)你可能希望對(duì)象的鍵是不可變的,可以使用 readonly 來限制對(duì)象的屬性是只讀的。這對(duì)確保數(shù)據(jù)的不可變性非常有用。
interface ReadOnlyDict {
readonly [key: string]: number;
}
const readOnlyDict: ReadOnlyDict = {
age: 30,
height: 175
};
console.log(readOnlyDict["age"]); // 輸出: 30
// readOnlyDict["age"] = 35; // Error: Cannot assign to 'age' because it is a read-only property.
在這個(gè)例子中,readOnlyDict 的屬性值是只讀的,意味著你不能更改這些值。
5. 使用類與索引簽名
索引簽名不僅適用于接口,還可以應(yīng)用于類。當(dāng)類具有索引簽名時(shí),類的實(shí)例可以使用任意的字符串作為鍵。
class MyClass {
[key: string]: string;
constructor() {
this["name"] = "John";
}
}
const obj = new MyClass();
obj["age"] = "30"; // 可以動(dòng)態(tài)添加新的屬性
console.log(obj.name); // 輸出: John
console.log(obj.age); // 輸出: 30
在這個(gè)例子中,MyClass 類允許通過字符串鍵訪問和修改屬性。
6. 限制索引簽名值的類型
你可以使用聯(lián)合類型來限制索引簽名的值類型。例如:
interface EventDetails {
[key: string]: "start" | "end"; // 值只能是 "start" 或 "end"
}
const event: EventDetails = {
event1: "start",
event2: "end"
};
console.log(event["event1"]); // 輸出: start
在這個(gè)例子中,EventDetails 類型的所有值只能是 "start" 或 "end"。
7. 結(jié)合其他類型使用索引簽名
索引簽名也可以與其他類型結(jié)合使用,提供更加靈活的類型設(shè)計(jì)。例如,在組合不同接口時(shí),你可能會(huì)同時(shí)使用索引簽名和其他屬性。
interface Car {
make: string;
model: string;
[key: string]: string | number; // 支持字符串或數(shù)字類型的任意額外屬性
}
const car: Car = {
make: "Toyota",
model: "Corolla",
year: 2020, // 額外的屬性
color: "Red"
};
console.log(car);
在這個(gè)例子中,Car 類型具有 make 和 model 兩個(gè)具體屬性,并且可以通過索引簽名動(dòng)態(tài)添加其他的字符串或數(shù)字類型的屬性。
8. 動(dòng)態(tài)屬性和字面量類型
通過使用索引簽名,你可以讓對(duì)象的鍵動(dòng)態(tài)地決定類型,并在開發(fā)中提高靈活性。
type DynamicProperties = {
[key: string]: string;
};
const dynamicObject: DynamicProperties = {
name: "Alice",
age: "25",
occupation: "Engineer"
};
console.log(dynamicObject);
9. 類型推導(dǎo)與索引簽名
TypeScript 會(huì)根據(jù)你為索引簽名指定的類型自動(dòng)推導(dǎo)出對(duì)象的屬性類型。例如:
interface DynamicObject {
[key: string]: string | number;
}
const obj: DynamicObject = {
name: "Alice",
age: 30
};
console.log(obj["name"]); // 輸出: Alice
console.log(obj["age"]); // 輸出: 30
10. 使用索引簽名進(jìn)行合并
索引簽名也可以與其他對(duì)象類型合并,通過 & 進(jìn)行交叉組合。比如:
interface Name {
name: string;
}
interface Address {
address: string;
}
type Person = Name &
Address & {
[key: string]: string; // 任意的額外屬性
};
const person: Person = {
name: "John",
address: "123 Main St",
phone: "123-456-7890"
};
console.log(person);
11. 小結(jié)
- 索引簽名(Index Signatures) 用于定義允許具有動(dòng)態(tài)屬性名的對(duì)象。
- 使用
key: string或key: number作為鍵類型來表示對(duì)象的屬性鍵。 - 可以結(jié)合其他類型使用索引簽名,靈活地定義對(duì)象結(jié)構(gòu)。
- 通過
readonly限制對(duì)象的鍵為只讀。 - 索引簽名與類:類的實(shí)例也可以使用索引簽名來動(dòng)態(tài)訪問和修改屬性。
- 索引簽名與聯(lián)合類型:可以為索引簽名指定值的類型限制。
到此這篇關(guān)于TypeScript中索引簽名的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)TypeScript 索引簽名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)javascript面向?qū)ο?javascript實(shí)現(xiàn)繼承的方式
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)繼承的方式,學(xué)習(xí)javascript面向?qū)ο?,感興趣的小伙伴們可以參考一下2016-01-01
EditPlus 正則表達(dá)式 實(shí)戰(zhàn)(3)
這篇文章主要介紹了EditPlus 正則表達(dá)式 實(shí)戰(zhàn)(3)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
echarts學(xué)習(xí)筆記之圖表自適應(yīng)問題詳解
最近發(fā)現(xiàn)一個(gè)問題,echarts圖初始化后不能自適應(yīng)瀏覽器的縮放,所以下面這篇文章就來給大家介紹了關(guān)于echarts圖表自適應(yīng)問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
當(dāng)達(dá)到輸入長度時(shí)表單自動(dòng)切換焦點(diǎn)
給每個(gè)字段限制輸入長度,當(dāng)達(dá)到輸入長度時(shí)自動(dòng)切換焦點(diǎn),以增強(qiáng)表單的易用性,需要的朋友可以參考下2014-04-04
微信小程序?qū)崿F(xiàn)action-sheet彈出底部菜單功能【附源碼下載】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)action-sheet彈出底部菜單功能,結(jié)合實(shí)例形式分析了action-sheet組件彈出菜單的使用技巧,包括元素遍歷、事件響應(yīng)及屬性設(shè)置等操作方法,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12

