TypeScript索引签名是什么,语法怎样写
Admin 2022-06-23 群英技术资讯 808 次浏览
今天这篇我们来学习和了解“TypeScript索引签名是什么,语法怎样写”,下文的讲解详细,步骤过程清晰,对大家进一步学习和理解“TypeScript索引签名是什么,语法怎样写”有一定的帮助。有这方面学习需要的朋友就继续往下看吧!const salary1 = {
baseSalary: 100_000,
yearlyBonus: 20_000
};
const salary2 = {
contractSalary: 110_000
};
然后写一个获取总工资的函数
function totalSalary(salaryObject: ???) {
let total = 0;
for (const name in salaryObject) {
total += salaryObject[name];
}
return total;
}
totalSalary(salary1); // => 120_000
totalSalary(salary2); // => 110_000
如果是你的,要如何声明totalSalary()函数的salaryObject参数,以接受具有字符串键和数字值的对象?
答案是使用一个索引签名!
接着,我们来看看什么是 TypeScript 索引签名以及何时需要它们。
索引签名的思想是在只知道键和值类型的情况下对结构未知的对象进行类型划分。
它完全符合salary参数的情况,因为函数应该接受不同结构的salary对象,唯一的要求是属性值为数字。
我们用索引签名来声明salaryObject参数
function totalSalary(salaryObject: { [key: string]: number }) {
let total = 0;
for (const name in salaryObject) {
total += salaryObject[name];
}
return total;
}
totalSalary(salary1); // => 120_000
totalSalary(salary2); // => 110_000
{[key: string]: number} 是索引签名,它告诉TypeScript salaryObject 必须是一个以string 类型为键,以 number 类型为值的对象。
索引签名的语法相当简单,看起来与属性的语法相似,但有一点不同。我们只需在方括号内写上键的类型,而不是属性名称:{ [key: KeyType]: ValueType }。
下面是一些索引签名的例子。
string 类型是键和值。
interface StringByString {
[key: string]: string;
}
const heroesInBooks: StringByString = {
'Gunslinger': '前端小智',
'Jack Torrance': '王大志'
};
string 类型是键,值可以是 string、number或boolean
interface Options {
[key: string]: string | number | boolean;
timeout: number;
}
const options: Options = {
timeout: 1000,
timeoutMessage: 'The request timed out!',
isFileUpload: false
};
签名的键只能是一个 string`、number或 symbol`。其他类型是不允许的。

TypeScript中的索引签名有一些注意事项,需要注意。
如果试图访问一个索引签名为 { [key: string]: string } 的对象的一个不存在的属性,会发生什么?
正如预期的那样,TypeScript 将值的类型推断为 string。但是检查运行时值,它是undefined:

根据 TypeScript 提示, value变量是一个 string 类型,但是它的运行时值是 undefined。
索引签名只是将一个键类型映射到一个值类型,仅此而已。如果没有使这种映射正确,值类型可能会偏离实际的运行时数据类型。
为了使输入更准确,将索引值标记为 string 或 undefined。这样,TypeScript就会意识到你访问的属性可能不存在

假设有一个数字名称的字典:
interface NumbersNames {
[key: string]: string
}
const names: NumbersNames = {
'1': 'one',
'2': 'two',
'3': 'three',
// ...
};

不会,正常工作。
当在属性访问器中作为键使用时,JavaScript隐式地将数字强制为字符串(names[1]与names['1']相同)。TypeScript也会执行这个强制。
你可以认为 [key: string] 与 [key: string | number] 相同。
TypeScript有一个实用类型 Record<Keys, Type>,类似于索引签名。
const object1: Record<string, string> = { prop: 'Value' }; // OK
const object2: { [key: string]: string } = { prop: 'Value' }; // OK
那问题来了...什么时候使用 Record<Keys, Type>,什么时候使用索引签名?乍一看,它们看起来很相似
我们知道,索引签名只接受 string、number 或 symbol 作为键类型。如果你试图在索引签名中使用,例如,字符串字面类型的联合作为键,这是一个错误。

索引签名在键方面是通用的。
但是我们可以使用字符串字面值的联合来描述 Record<keys, Type>中的键
type Salary = Record<'yearlySalary'|'yearlyBonus', number>
const salary1: Salary = {
'yearlySalary': 120_000,
'yearlyBonus': 10_000
}; // OK
Record<Keys, Type> 是为了具体到键的问题。
建议使用索引签名来注释通用对象,例如,键是字符串类型。但是,当你事先知道键的时候,使用Record<Keys, Type>来注释特定的对象,例如字符串字面量' prop1' | 'prop2'被用于键值。
总结:
如果你不知道你要处理的对象结构,但你知道可能的键和值类型,那么索引签名就是你需要的。
索引签名由方括号中的索引名称及其类型组成,后面是冒号和值类型: { [indexName: KeyType]: ValueType }, KeyType 可以是一个 string、number 或 symbol,而ValueType 可以是任何类型。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
css怎样实现中奖公告无缝滚动的效果?相信大家在一些网站上都有看到过中奖公告,那么这样的循环而且无缝滚动的效果文字展示效果是怎样做的呢?下面我们通过一个实例来了解一下。
这篇文章主要介绍了Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例,帮助大家更好的理解和学习vue,感兴趣的朋友可以了解下
Nodejs构建mock数据并通过restapi风格调用接口访问数据如果我们只有json格式的数据文件,我们想通过访问url方式调用居然数据 确保电脑安装node环境如果你没有安装好node环境请移步http://nodejs.cn/ 一、安装json-server 1.新建demo文件cddemo 2.安装json-server npminstall-Sjson-
微信小程序实现评价功能 本文实例为大家分享了微信小程序实现评价的具体代码,供大家参考,具体内容如下 首先去图标库,找一个空心星图片和一个实星图片 先是效果图 代码 wxml文件 for循环5次,初始值是5星,data-name用于区别是那个评价的星星src="{{item-total+1>0?’…/image/empty_stars.png’:’…/image/entity_stars.png’}}"条件判断,图片判断一个是空星,一个实星,根据自己图片地址改变 <view class=& ...
数组的去重方法,其实无论实在实际项目还是在面试中都会有用到的,下面这篇文章主要给大家介绍了非常全面的12种js数组去重的方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008