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

項目中的一些場景:

2. 使用索引簽名
2.1 定義一個對象類型,允許使用字符串鍵名
interface Dictionary {
[key: string]: number;
}
const dict: Dictionary = {
age: 30,
height: 175
};
console.log(dict["age"]); // 輸出: 30
console.log(dict["height"]); // 輸出: 175
在這個例子中,Dictionary 類型允許我們使用任意的字符串作為鍵,并且每個鍵對應的值都是 number 類型。
2.2 字符串或數(shù)字作為索引類型
你可以指定索引的鍵可以是 字符串 或 數(shù)字,但你不能同時指定這兩種類型。如果你同時使用字符串和數(shù)字,TypeScript 會做一定的類型推導。
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. 限制鍵的類型
你可以使用 字面量類型 限制對象的索引簽名的鍵類型。例如,限制對象的鍵為 'a'、'b' 或 'c':
interface MyObject {
[key: "a" | "b" | "c"]: number;
}
const obj: MyObject = {
a: 1,
b: 2,
c: 3
};
console.log(obj.a); // 輸出: 1
在這個例子中,MyObject 只允許 a、b 和 c 作為鍵。鍵名之外的任何值都會導致編譯錯誤。
4. 只讀索引簽名
有時你可能希望對象的鍵是不可變的,可以使用 readonly 來限制對象的屬性是只讀的。這對確保數(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.
在這個例子中,readOnlyDict 的屬性值是只讀的,意味著你不能更改這些值。
5. 使用類與索引簽名
索引簽名不僅適用于接口,還可以應用于類。當類具有索引簽名時,類的實例可以使用任意的字符串作為鍵。
class MyClass {
[key: string]: string;
constructor() {
this["name"] = "John";
}
}
const obj = new MyClass();
obj["age"] = "30"; // 可以動態(tài)添加新的屬性
console.log(obj.name); // 輸出: John
console.log(obj.age); // 輸出: 30
在這個例子中,MyClass 類允許通過字符串鍵訪問和修改屬性。
6. 限制索引簽名值的類型
你可以使用聯(lián)合類型來限制索引簽名的值類型。例如:
interface EventDetails {
[key: string]: "start" | "end"; // 值只能是 "start" 或 "end"
}
const event: EventDetails = {
event1: "start",
event2: "end"
};
console.log(event["event1"]); // 輸出: start
在這個例子中,EventDetails 類型的所有值只能是 "start" 或 "end"。
7. 結合其他類型使用索引簽名
索引簽名也可以與其他類型結合使用,提供更加靈活的類型設計。例如,在組合不同接口時,你可能會同時使用索引簽名和其他屬性。
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);
在這個例子中,Car 類型具有 make 和 model 兩個具體屬性,并且可以通過索引簽名動態(tài)添加其他的字符串或數(shù)字類型的屬性。
8. 動態(tài)屬性和字面量類型
通過使用索引簽名,你可以讓對象的鍵動態(tài)地決定類型,并在開發(fā)中提高靈活性。
type DynamicProperties = {
[key: string]: string;
};
const dynamicObject: DynamicProperties = {
name: "Alice",
age: "25",
occupation: "Engineer"
};
console.log(dynamicObject);
9. 類型推導與索引簽名
TypeScript 會根據(jù)你為索引簽名指定的類型自動推導出對象的屬性類型。例如:
interface DynamicObject {
[key: string]: string | number;
}
const obj: DynamicObject = {
name: "Alice",
age: 30
};
console.log(obj["name"]); // 輸出: Alice
console.log(obj["age"]); // 輸出: 30
10. 使用索引簽名進行合并
索引簽名也可以與其他對象類型合并,通過 & 進行交叉組合。比如:
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. 小結
- 索引簽名(Index Signatures) 用于定義允許具有動態(tài)屬性名的對象。
- 使用
key: string或key: number作為鍵類型來表示對象的屬性鍵。 - 可以結合其他類型使用索引簽名,靈活地定義對象結構。
- 通過
readonly限制對象的鍵為只讀。 - 索引簽名與類:類的實例也可以使用索引簽名來動態(tài)訪問和修改屬性。
- 索引簽名與聯(lián)合類型:可以為索引簽名指定值的類型限制。
到此這篇關于TypeScript中索引簽名的實現(xiàn)示例的文章就介紹到這了,更多相關TypeScript 索引簽名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
js中apply和Math.max()函數(shù)的問題及區(qū)別介紹
這篇文章主要介紹了js中apply和Math.max()函數(shù)的問題,本文給大家?guī)韮煞N答案,每一種答案給大家介紹的非常詳細,在文章底部給大家提到了js中Math.max.apply和Math.max的區(qū)別,感興趣的朋友一起看看吧2018-03-03
淺析document.createDocumentFragment()與js效率
對于循環(huán)批量操作頁面的DOM有很大幫助!利用文檔碎片處理,然后一次性append,并且使用原生的javascript語句操作2013-07-07
詳解用Webpack與Babel配置ES6開發(fā)環(huán)境
這篇文章主要介紹了詳解用Webpack與Babel配置ES6開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03

