如何使用泛型按名称获取属性的类型

时间:2018-12-14 20:02:35

标签: typescript generics typescript-typings

我需要一种获取类或类型的任何属性的类型的方法。

例如,如果我有PersonClassPersonType,我想得到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>

它可以正常工作nId3number,而nId4string。但是,如果我不知道该怎么办,如果我想获得任何财产。我尝试这些:

// 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">

我得到:

enter image description here

enter image description here

2 个答案:

答案 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

或者如果您确实要使用inferconditional 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"]
相关问题