Чтение о остальных элементах в типах кортежей и попытка выяснить, как извлечь обобщенную часть типа:
type Attribute<Type> = { id: string, type?: Type };
type Position = { x: number, y: number };
let Position: Attribute<Position> = { id: "position" };
type Status = "active" | "inactive";
let Status: Attribute<Status> = { id: "status" };
Я уверен, что есть способ написатьусловный тип, который отобразит кортеж с различными Attribute<T>
на кортежи с различными T
.
type AttributeTypes<Attributes extends Attribute<any>[]> =
Attributes extends Attribute<infer T> ? T[] : never;
type Result = AttributeTypes<[typeof Position, typeof Status]> // should be `[Position, Status]`
Но я недостаточно хорошо понимаю этап вывода, и он всегда заканчивается в never
branch.
Последним шагом будет написание функции, которая использует выведенные типы как часть возврата ( Playground ):
function getAll<Attributes extends Attribute<any>[]>(
...attributes: Attributes
): AttributeTypes<Attributes> {
return attributes.map(attribute => attribute.type);
}
let [position, status]: [Position, Status] = getAll(Position, Status);