打字稿泛型作为参数
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>
。
我有一个 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>
。