繁体   English   中英

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

[英]How to get the type of a property by name using generics

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

例如,如果我有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>

它工作正常nId3是一个numbernId4是一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM