我需要一种获取类或类型的任何属性的类型的方法。
例如,如果我有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">
我得到:
答案 0 :(得分:2)
您只想要lookup types。如果T
是对象类型,而K
是其键之一(或此类键的并集)的类型,则T[K]
是该键的值的类型(或这些键的值类型的并集):
var nId1: PersonClass["nationalId"];
var nId2: PersonalType["nationalId"];
如果您需要定义GetProp
,那么无需条件类型就非常简单:
type GetProp<T, K extends keyof T> = T[K];
或者如果您必须允许不可分配给K
的{{1}}:
keyof T
或者如果您确实要使用infer
和conditional types,则需要一个像Record
这样的映射类型:
type GetProp<T, K extends keyof any> = K extends keyof T ? T[K] : never;
但是,在我看来,简单的查找类型确实是解决方法。
希望有帮助。祝好运!
答案 1 :(得分:1)
您需要使用映射类型语法对条件类型执行此操作:
type GetProp<T, K extends string> = T extends {[key in K]: infer U} ? U : never;
但是我认为您确实在寻找类型查询:
var nId1: PersonClass["nationalId"]
var nId2: PersonalType["nationalId"]