簡體   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