[英]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.