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!