Poznajemy słówko kluczowe infer, czyli już bardziej zaawansowany TypeScript. Bez zbędnych wstępów – do dzieła.

Ok, zobaczmy sobie taki interfejs:

interface Employee2 {
    id: number;
    name: string;
    age: number;
    salary: number;
}

Ok, utility type, który bierze dowolny obiekt i klucz tego obiektu i zwraca typ klucza:

type ValueOf<T extends object, K extends keyof T> = T[K];

type EmpIdVal = ValueOf<Employee2, 'id'>;

//type EmpIdVal = number

Ok, utility type, który bierze dowolny obiekt posiadający klucz id i zwraca typ klucza id:

type ValueOfId<T extends {id: any}> = T["id"];

type EmpIdVal2 = ValueOfId<Employee2>;

//type EmpIdVal2 = number

A teraz z infer możemy sobie wziąć dowolny obiekt dowolnego typu, jeżeli ten obiekt posiada klucz id to… to na razie zwrócimy 1, jeżeli nie to never:

type ValueOfId2<T extends object> = T extends {id: any} ? 1 : never;

type EmpIdVal3 = ValueOfId2<Employee2>

//type EmpIdVal2 = 1

type NoId = ValueOfId2<{name: string}>

//type NoId = never

Ok, fajnie, a teraz za pomocą słówka kluczowego infer możemy zrobić takie coś, że TS sam sprawdzi, jaki to typ, potem dać nazwę zmiennej, która ten typ przechwyci i możemy w miejsce 1 ten typ zwrócić:


type ValueOfId2<T extends object> = T extends {id: infer IdType} ? IdType : never;

type EmpIdVal3 = ValueOfId2<Employee2>

//type EmpIdVal2 = number

type StringId = ValueOfId2<{id: string}>

// type StringId = string;

type NoId = ValueOfId2<{name: string}>

//type NoId = never

I tak się bawimy z infer. Więcej infer niedługo!