TS中的keyof和typeof操作符

更新时间:2023-05-27 11:37:10 阅读: 评论:0

TS中的keyof和typeof操作符
TS 中的 keyof 和 typeof 操作符
keyof
六级各题型分值keyof ⽤于遍历某种类型的属性(可以操作接⼝、类以及基本数据类型)
在 TS 中定义⼀个获取函数属性的函数如下:
function prop(obj: object, key:string){
return obj[key];
}
在上⾯代码中,为了避免调⽤ prop 函数时传⼊错误的参数类型,我们为 obj 和 key 参数设置了类型,分别为 {} 和 string 类型。然⽽,事情并没有那么简单。针对上述的代码,TypeScript 编译器会输出以下错误信息:
Element implicitly has an ‘any’ type becau expression of type ‘string’ can’t be ud to index type ‘{}’.
元素隐式地拥有 any 类型,因为 string 类型不能被⽤于索引 {} 类型。要解决这个问题,你可以使⽤以下⾮常暴⼒的⽅案:
function prop(obj: object, key:string){
return(obj as any)[key];
}
该函数⽤于获取某个对象中指定属性的属性值。因此我们期望⽤户输⼊的属性是对象上已存在的属性,那么如何限制属性名的范围呢?这时我们可以利⽤本⽂的主⾓ keyof 操作符:
天下的近义词function prop<T extends object,K extends keyof T>(obj:T, key:K){
return obj[key];
}
在以上代码中,我们使⽤了 TypeScript 的泛型和泛型约束。⾸先定义了 T 类型并使⽤ extends 关键字约束该类型必须是 object 类型的⼦类型,然后使⽤ keyof 操作符获取 T 类型的所有键,其返回类型是联合类型,最后利⽤ extends 关键字约束 K 类型必须为 keyof T 联合类型的⼦类型。
keyof 与对象的数值属性
在使⽤对象的数值属性时,我们也可以使⽤ keyof 关键字。请记住,如果我们定义⼀个带有数值属性的对象,那么我们既需要定义该属性,⼜需要使⽤数组语法访问该属性:
class ClassWithNumericProperty {
[1]:string="Semlinker";
}
let classWithNumeric =new ClassWithNumericProperty();
console.log(`${classWithNumeric[1]} `);
下⾯我们来举个⽰例,介绍⼀下在含有数值属性的对象中,如何使⽤ keyof 操作符来安全地访问对象的属性:
enum Currency {
菊花功效
CNY=6,
EUR=8,
USD=10
}
const CurrencyName ={
[CurrencyY]:"⼈民币",
[Currency.EUR]:"欧元",
[Currency.USD]:"美元"
};
三国历史故事console.log(`CurrencyName[CurrencyY] = ${CurrencyName[CurrencyY]}`);
console.log(`CurrencyName[36] = ${CurrencyName[6]}`);
为了⽅便⽤户能根据货币类型来获取对应的货币名称,我们来定义⼀个 getCurrencyName 函数,具体实现如下:
function getCurrencyName<T,K extends keyof T>(key:K, map:T):T[K]{
return map[key];
}
楚河汉界在哪里console.log(`name = ${getCurrencyName(CurrencyY, CurrencyName)}`);
同样,getCurrencyName 函数和前⾯介绍的 prop 函数⼀样,使⽤了泛型和泛型约束,从⽽来保证属性的安全访问。
typeof
typeof 操作符⽤于获取变量的类型。因此这个操作符的后⾯接的始终是⼀个变量,且需要运⽤到类型定义当中。为了⽅便⼤家理解,我们来举⼀个具体的⽰例:
涟漪造句type Person ={
name:string;
age:number;
}
let man: Person ={
name:"Semlinker",
age:30
}
type Human =typeof man;
typeof 和 keyof ⼀起使⽤
const COLORS={
red:'red',
blue:'blue'
}
/
/ ⾸先通过typeof操作符获取color变量的类型,然后通过keyof操作符获取该类型的所有键,
// 即字符串字⾯量联合类型 'red' | 'blue'
type Colors = keyof typeof COLORS
let color: Colors;
color ='red'// Ok
color ='blue'// Ok
// Type '"yellow"' is not assignable to type '"red" | "blue"'.
color ='yellow'// Error
如果直接 keyof ⼀个对象变量的话,获取到的并不是该对象的属性组成的联合类型,⽽会是该对象的⽅法及属性的联合类型,⽐如除了属性还会有 “valueOf” “toString” 等。
思考
最后留到思考题,有兴趣的⼩伙伴可以想⼀想:
interface StringIndexArray {
[index:string]:string;
}
interface NumberIndexArray {
最新劳动法[index:number]:string;
}蒙古国历史
type K1= keyof StringIndexArray // type K1 = string | number type K2= keyof NumberIndexArray // type K2 = number

本文发布于:2023-05-27 11:37:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/791971.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:属性   类型   对象   获取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图