Получить тип параметра из универсального на TypeScript - PullRequest
0 голосов
/ 20 марта 2019

Предположим, у меня есть следующий фрагмент кода:

interface Generic <S, T> {
    _?: [S, T];
    id: string;
    ...
}

interface A {}
interface B {}
interface C {}
interface D {}

type t1 = Generic<A, B>;
type t2 = Generic<B, C>;

Это код, который я не могу изменить (из другого пакета). Мой вопрос: есть ли у меня способ программно узнать, что такое S и T для данного типа (например, t1, t2)?

У меня есть сильное подозрение, что, поскольку эта информация теряется после компиляции, я никогда не смогу выяснить, что такое S и T во время выполнения. Что еще хуже, я не смогу взглянуть на детали из t1 и t2 (, как и предыдущий вопрос ).

Тем не менее, поскольку я очень плохо знаком с TypeScript, мне интересно, не знаю ли я, как правильно задать вопрос, и у Интернета действительно есть ответ для меня.

Так возможно ли это? Как?

1 Ответ

0 голосов
/ 20 марта 2019

Вы правы, так как типы TypeScript стираются во время выполнения, тогда вы не можете получить к ним доступ. Однако вы можете получить доступ к типам общих параметров во время компиляции, используя условные типы :

type FirstOfGeneric<G> = G extends Generic<infer F, any> ? F : never;
type SecondOfGeneric<G> = G extends Generic<any, infer S> ? S : never;

// type t1_f = A
type t1_f = FirstOfGeneric<t1>;
// type t1_s = B
type t1_s = SecondOfGeneric<t1>;

Затем вы можете использовать стандартные функции TS, такие как typeguards и приведение типов, чтобы действовать на экземпляры времени выполнения t1_f и t1_s,

...