打字稿泛型作为参数

Typescript Generic as Parameter

我有一个 class:

export class BaseClass<T> {
    constructor(data?: Partial<T>) {
        Object.assign(this, data);
    }
    name: string;
    id: number;
}

由此class,我扩展了属性:

export class ExampleOne extends BaseClass<ExampleOne> {
    isReusable: boolean;
}

export class ExampleTwo extends BaseClass<ExampleTwo> {
    propOne: string;
    propTwo: boolean;

}

我在 BaseClass 中使用了一个映射类型,这样我就可以使用 C# 的 "similar" 语法来初始化一个对象,并在后续的 class 中重用构造函数继承基类。

var x = new ExampleTwo({name: 'test', id: 1, propOne: 'test', propTwo: false});

这一切似乎工作正常,但我想将这些派生的 classes 中的任何一个作为参数传递给另一个函数。

testFunction(data: BaseClass<T>) {
    //logic
}

我收到一条错误消息,指出构建 Cannot find name T。我将签名更改为

testFunction(data: BaseClass<any>) {
    //logic
}

这似乎有效,但我觉得应该有更好的方法来处理这个问题。

我错过了什么?

您的解决方案有效,但前提是您在 // logic 中将 data 作为 opaque 对象访问。这意味着您只是将它作为参考传递,并且您的逻辑不关心对象具有什么属性,而不关心 BaseClass.

上存在的属性。

为了使其可以作为 transparent 对象访问,这将允许像 keyof 等实例的类型安全反射,您应该使用泛型类型参数 T 像这样:

testFunction<T>(data: BaseClass<T>) {
  // logic
}

您第一次尝试导致错误的原因是 testFunction 所属的 class 显然不是像 class Foo<T> { ... } 这样的通用 class , 只是 class Foo { ... }.

如果 class 中有多个函数需要访问 T 类型,那么我建议将其设为通用 class,这样您就不必添加类型每个成员方法的参数 <T>