TypeScript - 获取泛型类参数的类型

18 浏览
0 Comments

TypeScript - 获取泛型类参数的类型

我需要实现一个类型GetClassParameter,它的工作方式如下:

class Foo {
}
type foo = Foo
type x = GetClassParameter; // 应该是string

如果这是重复的问题,我很抱歉,我没有找到它。我只找到了一个硬编码的解决方案(source):

type GetFooParameter> = T extends Foo ? R : unknown;

我尝试了类似这样的解决方案:

class Foo {
    public value: T;
    public value2: string;
    constructor (value: T) {
        this.value = value;
    }
}
type BaseT = {
  value: T  // 如果删除,它将无法工作
}
type GetClassParameter> = T extends BaseT ? R : unknown;
type x = GetClassParameter // string - 几乎可以工作,需要与T共享属性

上面的代码几乎可以工作,但需要BaseT有一个value: T属性。

有没有一种方法可以在不硬编码任何内容的情况下实现它,假设目标类只有一个泛型参数?

更新:

另一种尝试,不成功。

type ClassLike = (new (...args: any[]) => any);
type GetClassParameter> = T extends ClassLike ? R : unknown;
type x = GetClassParameter // 错误,不满足约束条件

更新2

目前不可能。尽管如此,我尝试了一个小技巧,定义了一个具有value属性的BaseT,然后将其删除。但它不起作用。我将其作为参考添加,以防有人有类似的想法,以节省您的时间。 playground

更新3

我正在添加一个我正在使用的解决方法,用于获取两个没有任何共同之处的类的类参数类型(通过添加额外的条件语句,可以扩展到更多类)。

playground

class Alpha {
    private a: T;
}
class Beta {
    private b: T;
}
type GetClassParameterForAlphaBeta | Beta> =
    T extends Alpha
    ? R : T extends Beta
    ? R : unknown;
type alpha = Alpha
type beta = Beta
type x = GetClassParameterForAlphaBeta // string
type y = GetClassParameterForAlphaBeta // number

0
0 Comments

TypeScript - 获取泛型类参数的类型

在TypeScript中,无法直接获取泛型类参数的类型。这是一个尚未解决的问题,有一个开放的问题追踪,旨在允许通过高级别泛型类型传递参数。这个问题对于许多试图对高度可修改的js库(如levelup)进行类型化的人来说是一个难题。

下面给出一个更简单的不起作用的示例:

interface Dummy {};
declare function getParam>(a: T): P;
let a = getParam(null as Dummy);

在这个例子中,a的类型是unknown。

唯一真正的解决方法是将泛型参数移到虚拟接口中作为一个虚拟属性,但是这样一来,传递给它的每个参数都需要定义该虚拟属性,否则又回到了unknown类型。

interface Dummy {
  a?: T
};
declare function getParam>(a: T): T["a"]
let a = getParam(null as Foo);

现在a的类型是string,但是TypeScript仍然不知道P是什么类型。

虽然与此问题无关,但在Flow中可以实现这个功能。

0