-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TypeScript 之 Indexed Access Types #225
Comments
|
@btea 是的,感谢提醒,原文已经修改 |
关于最后的实战部分, 想请教两个问题
enum App {
'TaoBao' = 'TaoBao',
'Tmall' = 'Tmall',
'Alipay' = 'Alipay'
}
function getPhoto(app: App) {
// ...
}
getPhoto(App.TaoBao);
getPhoto('sss'); // not ok |
1.#229 |
通过一个数组值,来获取它的索引类型,使用 typeof arr[number] ,这个[number]觉得好别扭阿.有点像泛指arr的所有索引,好怪阿,设计成这样 |
感谢,说实话索引访问类型之前一直没用到,不过文中实战的例子倒是一个不错的应用场景 |
我觉得可以理解为,先typeof arr,这里取得的是一个类型,而不是一个值,对于这个类型x,我们在通过x[number],如果x是一个值,[]里面肯定是不能填一个number类型的,而如果x是一个类型,我们可以通过在[]中传入另外一个类型,以达到索引访问类型的效果 |
这样在使用的时候需要导入 enum App |
前言
TypeScript 的官方文档早已更新,但我能找到的中文文档都还停留在比较老的版本。所以对其中新增以及修订较多的一些章节进行了翻译整理。
本篇整理自 TypeScript Handbook 中 「Indexed Access Types」 章节。
本文并不严格按照原文翻译,对部分内容也做了解释补充。
正文
我们可以使用 索引访问类型(indexed access type) 查找另外一个类型上的特定属性:
因为索引名本身就是一个类型,所以我们也可以使用联合、
keyof
或者其他类型:如果你尝试查找一个不存在的属性,TypeScript 会报错:
接下来是另外一个示例,我们使用
number
来获取数组元素的类型。结合typeof
可以方便的捕获数组字面量的元素类型:作为索引的只能是类型,这意味着你不能使用
const
创建一个变量引用:然而你可以使用类型别名实现类似的重构:
最后讲一个实战案例:
假设有这样一个业务场景,一个页面要用在不同的 APP 里,比如淘宝、天猫、支付宝,根据所在 APP 的不同,调用的底层 API 会不同,我们可能会这样写:
如果我们仅仅是对 app 约束为
string
类型,即使传入其他的字符串,也不会导致报错,我们可以使用字面量联合类型约束一下:但写两遍又有些冗余,我们怎么根据一个数组获取它的所有值的字符串联合类型呢?我们就可以结合上一篇的
typeof
和本节的内容实现:我们来一步步解析:
首先是使用
as const
将数组变为readonly
的元组类型:但此时
APP
还是一个值,我们通过typeof
获取APP
的类型:最后在通过索引访问类型,获取字符串联合类型:
TypeScript 系列
TypeScript 系列文章由官方文档翻译、重难点解析、实战技巧三个部分组成,涵盖入门、进阶、实战,旨在为你提供一个系统学习 TS 的教程,全系列预计 40 篇左右。点此浏览全系列文章,并建议顺便收藏站点。
微信:「mqyqingfeng」,加我进冴羽唯一的读者群。
如果有错误或者不严谨的地方,请务必给予指正,十分感谢。如果喜欢或者有所启发,欢迎 star,对作者也是一种鼓励。
The text was updated successfully, but these errors were encountered: