从TypeScript上的泛型获取参数类型

时间:2019-03-19 21:58:40

标签: typescript typescript-generics

假设我有以下代码段:

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>;

这是我不能更改的代码(从另一个程序包)。我的问题是:我是否可以通过编程方式找出给定类型(例如t1,t2)的S和T是什么?

我非常怀疑,由于这些信息在编译后会丢失,因此我永远无法弄清运行时的S和T。更糟糕的是,我将无法查看t1和t2(just like this previous question)的详细信息。

但是,由于我是TypeScript的新手,所以我想知道我是否不知道正确的提问方式,而互联网实际上为我提供了答案。

那么,有可能吗?怎么样?

1 个答案:

答案 0 :(得分:0)

您是正确的,因为在运行时会擦除TypeScript类型,因此您将无法访问它们。但是,您可以在编译时使用conditional types访问通用参数的类型:

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_ft1_s的运行时实例进行操作,