Typescript 索引签名
编程语言TypeScript是基于JavaScript的,是强类型的、面向对象的和编译的。该语言通过静态类型、类和接口等工具进行了改进,有助于早期错误检测,使JavaScript更易于管理。TypeScript的一个特点是能够强制对象的索引成员的类型,这个过程也被称为索引签名。
索引签名是一组键值对,描述了一个对象可能具有的许多属性。属性名的类型和属性值的类型分别用值和键来指定。为了强制执行一个对象的属性种类,用户可以利用TypeScript的索引签名功能。
索引签名可以有效地强制执行某些对象属性,但也会使代码在理解和维护方面具有挑战性。因此,只有在必要时,才有必要使用索引签名。
语法
let objectName: {
[key: string]: string
}
在上面的语法中,’objectName’是我们的对象的名称,我们把键的类型执行为一个字符串,把值执行为一个字符串。
示例1
在这个例子中,我们有两个接口,Person和PhoneBook。Person接口定义了一个有两个属性的人物对象的结构:姓名(字符串)和年龄(数字)。PhoneBook接口定义了一个索引签名,将字符串类型作为键,将Person接口作为值。这意味着任何实现PhoneBook接口的对象只能有键为字符串类型、值为Person类型的属性。
然后我们定义一个类型为PhoneBook的变量phoneBook,并指定一个空对象。然后我们在电话簿中添加一些条目,这些条目应该以名字为键,以Person对象为值。最后,我们在控制台记录这些值,以验证我们是否试图把任何其他类型的变量代替上述类型,然后编译器会给出一个错误。
// Person interface
interface Person {
name: string
age: number
}
// PhoneBook interface
interface PhoneBook {
[key: string]: Person
}
let phoneBook: PhoneBook = {}
phoneBook['Person 1'] = { name: 'ABC', age: 30 }
phoneBook['Person 2'] = { name: 'XYZ', age: 25 }
phoneBook['Person 3'] = { name: 'MNO', age: 10 }
console.log(phoneBook)
On compiling, it will generate the following JavaScript code −
var phoneBook = {};
phoneBook['Person 1'] = { name: 'ABC', age: 30 };
phoneBook['Person 2'] = { name: 'XYZ', age: 25 };
phoneBook['Person 3'] = { name: 'MNO', age: 10 };
console.log(phoneBook);
输出
上述代码将产生以下输出 –
{ 'Person 1': { name: 'ABC', age: 30 },
'Person 2': { name: 'XYZ', age: 25 },
'Person 3': { name: 'MNO', age: 10 } }
示例2
在这个例子中,我们有一个接口Product,它定义了一个有两个属性的产品对象的结构:名称(字符串)和价格(数字)。然后我们有另一个接口ShoppingCart,它表示一个索引签名,用数字类型作为键,用产品接口作为值。任何实现ShoppingCart接口的对象只能有键为数字类型、值为产品类型的属性。
然后我们定义一个ShoppingCart类型的变量cart,并给它分配一个空对象。然后我们向购物车添加一些条目,这些条目应该以产品ID为键,产品对象为值。我们可以看到,这些条目被正确地添加到购物车中,如果值不是产品类型,或者产品对象缺少产品接口中定义的任何属性,购物车会出现错误。
interface Product {
name: string
price: number
}
// ShoppingCart interface
interface ShoppingCart {
[key: number]: Product
}
let cart: ShoppingCart = {}
cart[1] = { name: 'Shirt', price: 20 }
cart[2] = { name: 'Pants', price: 30 }
cart[3] = { name: 'Shoes', price: 40 }
console.log(cart[1])
console.log(cart[2])
console.log(cart[3])
On compiling, it will generate the following JavaScript code −
var cart = {};
cart[1] = { name: 'Shirt', price: 20 };
cart[2] = { name: 'Pants', price: 30 };
cart[3] = { name: 'Shoes', price: 40 };
console.log(cart[1]);
console.log(cart[2]);
console.log(cart[3]);
输出
上述代码将产生以下输出 –
{ name: 'Shirt', price: 20 }
{ name: 'Pants', price: 30 }
{ name: 'Shoes', price: 40 }
这些例子说明了如何使用索引签名来强制执行一个对象的属性类型。索引签名是一个强大的功能,可以帮助你写出更健壮和可维护的代码,但重要的是要明智地使用它们,并且只在必要时使用。