在 TypeScript 中,我们可以使用反射(Reflection)来获取类型属性的名称,反射是计算机编程中的一种能力,它允许程序在运行时检查和修改其自身的结构和行为,在 TypeScript 中,我们可以使用 typeof
关键字和 keyof
关键字来实现反射。
1、使用 typeof
关键字获取类型名称
typeof
关键字用于获取一个变量或表达式的类型。
let num: number = 42; console.log(typeof num); // 输出 "number"
2、使用 keyof
关键字获取类型属性名称
keyof
关键字用于获取一个类型的所有属性名称。
interface Person { name: string; age: number; } type PersonKeys = keyof Person; // "name" | "age"
3、结合 typeof
和 keyof
关键字获取类型属性名称
我们可以结合 typeof
和 keyof
关键字来获取一个类型的所有属性名称。
interface Person { name: string; age: number; } function getPropertyNames<T>(obj: T): (keyof T)[] { return Object.keys(obj) as (keyof T)[]; } let person: Person = { name: "张三", age: 30 }; let propertyNames: (keyof Person)[] = getPropertyNames(person); // ["name", "age"]
在这个例子中,我们定义了一个名为 getPropertyNames
的泛型函数,它接受一个对象作为参数,并返回该对象的所有属性名称,我们使用 Object.keys()
方法获取对象的属性名称,然后将其转换为 (keyof T)[]
类型,这样,我们就可以为任何类型获取其属性名称了。
4、使用 in
关键字检查类型是否具有某个属性
我们还可以使用 in
关键字来检查一个类型是否具有某个属性。
interface Person { name: string; age: number; } function hasProperty<T>(obj: T, prop: keyof T): boolean { return prop in obj; } let person: Person = { name: "张三", age: 30 }; console.log(hasProperty(person, "name")); // 输出 true console.log(hasProperty(person, "gender")); // 输出 false
在这个例子中,我们定义了一个名为 hasProperty
的泛型函数,它接受一个对象和一个属性名称作为参数,并返回一个布尔值,表示该对象是否具有该属性,我们使用 in
关键字来检查对象是否具有给定的属性,这样,我们就可以为任何类型检查其是否具有某个属性了。
5、使用条件类型和映射类型获取类型属性名称数组
我们还可以使用条件类型和映射类型来获取一个类型的所有属性名称数组。
interface Person { name: string; age: number; } type PropertyNames<T> = { [K in keyof T]: K } extends { [_: never]: infer U } ? U extends string ? U[] : never : never; let propertyNames: PropertyNames<Person> = ["name", "age"]; // ["name", "age"]
在这个例子中,我们定义了一个名为 PropertyNames
的类型,它接受一个类型参数 T
,我们使用条件类型和映射类型来生成一个新的类型,该类型的属性名称与 T
的类型属性名称相同,我们将这个新类型的属性名称转换为字符串数组,这样,我们就可以为任何类型获取其属性名称数组了。
最新评论
本站CDN与莫名CDN同款、亚太CDN、速度还不错,值得推荐。
感谢推荐我们公司产品、有什么活动会第一时间公布!
我在用这类站群服务器、还可以. 用很多年了。