TypeScript中索引簽名的實(shí)現(xiàn)示例
1. 基本語(yǔ)法
索引簽名的基本語(yǔ)法如下:
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 來(lái)限制對(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 類允許通過(guò)字符串鍵訪問(wèn)和修改屬性。
6. 限制索引簽名值的類型
你可以使用聯(lián)合類型來(lái)限制索引簽名的值類型。例如:
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è)具體屬性,并且可以通過(guò)索引簽名動(dòng)態(tài)添加其他的字符串或數(shù)字類型的屬性。
8. 動(dòng)態(tài)屬性和字面量類型
通過(guò)使用索引簽名,你可以讓對(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ì)象類型合并,通過(guò) & 進(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作為鍵類型來(lái)表示對(duì)象的屬性鍵。 - 可以結(jié)合其他類型使用索引簽名,靈活地定義對(duì)象結(jié)構(gòu)。
- 通過(guò)
readonly限制對(duì)象的鍵為只讀。 - 索引簽名與類:類的實(shí)例也可以使用索引簽名來(lái)動(dòng)態(tài)訪問(wèn)和修改屬性。
- 索引簽名與聯(lián)合類型:可以為索引簽名指定值的類型限制。
到此這篇關(guān)于TypeScript中索引簽名的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)TypeScript 索引簽名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入淺出使用JS/TS輕松搞定Excel與XML互轉(zhuǎn)
在一些場(chǎng)景下,程序化的Excel與XML轉(zhuǎn)換能力就顯得尤為重要,這篇文章主要為大家詳細(xì)介紹了如何使用JS/TS輕松搞定Excel與XML互轉(zhuǎn),感興趣的小伙伴可以了解下2025-07-07
js實(shí)現(xiàn)從右往左勻速顯示圖片(無(wú)縫輪播)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)從右往左勻速顯示圖片,無(wú)縫輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
js中apply和Math.max()函數(shù)的問(wèn)題及區(qū)別介紹
這篇文章主要介紹了js中apply和Math.max()函數(shù)的問(wèn)題,本文給大家?guī)?lái)兩種答案,每一種答案給大家介紹的非常詳細(xì),在文章底部給大家提到了js中Math.max.apply和Math.max的區(qū)別,感興趣的朋友一起看看吧2018-03-03
用原生JS對(duì)AJAX做簡(jiǎn)單封裝的實(shí)例代碼
下面小編就為大家?guī)?lái)一篇用原生JS對(duì)AJAX做簡(jiǎn)單封裝的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
淺析document.createDocumentFragment()與js效率
對(duì)于循環(huán)批量操作頁(yè)面的DOM有很大幫助!利用文檔碎片處理,然后一次性append,并且使用原生的javascript語(yǔ)句操作2013-07-07
js實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,制作能進(jìn)行加減乘除的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
JS動(dòng)態(tài)計(jì)算移動(dòng)端rem的解決方案
移動(dòng)設(shè)備分辨率五花八門雖然我們可以通過(guò)CSS3的media query來(lái)實(shí)現(xiàn)適配,但是這種做法并不能適配所有設(shè)備,這篇文章主要介紹了js動(dòng)態(tài)計(jì)算移動(dòng)端rem的解決方案,非常不錯(cuò),感興趣的朋友一起看看吧2016-10-10
詳解用Webpack與Babel配置ES6開發(fā)環(huán)境
這篇文章主要介紹了詳解用Webpack與Babel配置ES6開發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
前端實(shí)現(xiàn)pdf文件預(yù)覽的操作步驟方法
這篇文章主要介紹了前端實(shí)現(xiàn)pdf文件預(yù)覽的操作步驟方法,前端實(shí)現(xiàn)PDF文件流預(yù)覽可以使用多種方法,其中一種常用的方法是使用PDF.js庫(kù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07

