[英]How to get the type of a property by name using generics
我需要一种方法来获取类或类型的任何属性的类型。
例如,如果我有PersonClass
和PersonType
我想获得nationalId
类型。 我可以做这个:
class PersonClass{
name: string
nationalId: number
}
type PersonalType={
name: string
nationalId: string
}
type GetNationalIdType<T> = T extends {nationalId: infer U} ? U : never;
var nId3: GetNationalIdType<PersonClass>
var nId4: GetNationalIdType<PersonalType>
它工作正常nId3
是一个number
, nId4
是一个string
。 但如果我想要获得任何财产,我不知道该怎么办。 我试试这些:
// type GetProp<T, K> = T extends {[key: K]: infer U} ? U : never;
type GetProp<T, K extends string> = T extends {[key: K]: infer U} ? U : never;
var nId1: GetProp<PersonClass, "nationalId">
var nId2: GetProp<PersonalType, "nationalId">
我得到:
你只想要查找类型 。 如果T
是一个对象类型而K
是其中一个键的类型(或这些键的并集),则T[K]
是该键的值的类型(或这些键的值类型的并集) ):
var nId1: PersonClass["nationalId"];
var nId2: PersonalType["nationalId"];
如果您觉得需要定义GetProp
,那么没有条件类型就非常简单:
type GetProp<T, K extends keyof T> = T[K];
或者如果你必须允许K
不能分配给keyof T
:
type GetProp<T, K extends keyof any> = K extends keyof T ? T[K] : never;
或者如果你真的想使用infer
和条件类型 ,你需要像Record
这样的映射类型:
type GetProp<T, K extends keyof any> = T extends Record<K, infer V> ? V : never;
但在我看来,真正简单的查找类型是要走的路。
希望有所帮助。 祝好运!
您需要使用映射类型语法来执行条件类型:
type GetProp<T, K extends string> = T extends {[key in K]: infer U} ? U : never;
但我认为你真的在寻找一个类型查询:
var nId1: PersonClass["nationalId"]
var nId2: PersonalType["nationalId"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.