Машинописный родовой союз - PullRequest
0 голосов
/ 15 ноября 2018

Итак, у меня есть Array универсального объекта и я хочу перебрать его, но машинопись не позволит мне. Вот пример кода. Любые предложения о том, как это можно решить.

type someGeneric<T> = { item: T };

type stringGeneric = someGeneric<string>;

type numberGeneric = someGeneric<number>;

type someFunction = <T>(generic: someGeneric<T>) => T;

const someFunction: someFunction = (generic) => generic.item;

const stringGeneric: stringGeneric = { item: 'some String' },
    numberGeneric: numberGeneric = { item: 12 };

let genericArray = [stringGeneric, numberGeneric];
genericArray.forEach(generic => {
    someFunction(generic); // Error On This line.
});

Вы можете просто скопировать и вставить код в эту ссылку . Кажется, я не могу поделиться кодом.

1 Ответ

0 голосов
/ 15 ноября 2018

Проблема в том, что функция принимает параметр типа someGeneric<T>, если мы попытаемся передать параметр типа someGeneric<number> | someGeneric<string> typcript не будет пытаться вывести T, из этого просто скажет, что объединение несовместимос типом someGeneric<T>

Мы можем изменить определение функции так, чтобы параметр типа расширялся someGeneric<any>.Это ограничение будет совместимо с объединением.Затем мы можем использовать условный тип для извлечения типа элемента из T, используя условный тип.Поскольку условные типы распределяются по объединениям, результатом извлечения будет объединение общих параметров в someGeneric<T>

type someGeneric<T> = { item: T };

type stringGeneric = someGeneric<string>;

type numberGeneric = someGeneric<number>;

type extractItemFromSomeGeneric<T extends someGeneric<any>> = T extends someGeneric<infer U> ? U : never;  
type someFunction = <T extends someGeneric<any>>(generic: T) => extractItemFromSomeGeneric<T>;

const someFunction: someFunction = (generic) => generic.item;

const stringGeneric: stringGeneric = { item: 'some String' },
    numberGeneric: numberGeneric = { item: 12 };

let someGeneric = [stringGeneric, numberGeneric];
someGeneric.forEach(generic => {
    someFunction(generic); // retruns string | number
});

Ссылка для игровой площадки

...