假设我有以下代码段:
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的新手,所以我想知道我是否不知道正确的提问方式,而互联网实际上为我提供了答案。
那么,有可能吗?怎么样?
答案 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_f
和t1_s
的运行时实例进行操作,