Как получить тип свойства по имени, используя дженерики - PullRequest
0 голосов
/ 14 декабря 2018

Мне нужен способ получить тип любого свойства класса или типа.

Например, если у меня были 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">

И я получаю:

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы просто хотите типы поиска .Если 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;

Но на самом деле простой способ поиска - это, на мой взгляд, путь.

Надеюсь, это поможет.Удачи!

0 голосов
/ 14 декабря 2018

Вам нужно использовать синтаксис сопоставленного типа, чтобы сделать это с условными типами:

type GetProp<T, K extends string> = T extends {[key in K]: infer U} ? U : never;

Но я думаю, что вы действительно ищете запрос типа:

var nId1: PersonClass["nationalId"]
var nId2: PersonalType["nationalId"]
...