【发布时间】:2021-07-16 21:44:59
【问题描述】:
假设我有以下泛型类,它有两个字段:一个是字符串,另一个是完全任意的泛型——无论我希望它在实例化时是什么:
class Parent<T> {
stringField: String
genericField: T;
constructor(stringField: String, genericField: T) {
this.stringField = stringField;
this.genericField = genericField;
}
}
实例化它可以按预期工作,例如new Parent("hello", "world").genericField 为字符串提供智能感知,new Parent("hello", 10000).genericField 为数字提供智能感知等。
现在假设我想扩展Parent。除了stringField 和genericField 的值之外,这个新的子类构造函数还应采用Parent 构造函数中不存在的一个附加参数。
但是,我不想只是复制粘贴 Parent 参数,因为如果我需要更改 Parent,那是不可扩展的。所以相反,我想使用ConstructorParameters 实用程序类型来推断那些冗余参数并将它们自动传递给super 调用,类似于这样:
class Child<G> extends Parent<G> {
numberField: Number;
constructor(numberField: Number, ...params:ConstructorParameters<typeof Parent>) {
super(...params);
this.numberField = numberField;
}
}
但是,这并没有按预期工作。上面在Child 类中对super 的调用会产生以下编译器错误:Argument of type 'unknown' is not assignable to parameter of type 'G'. 'G' could be instantiated with an arbitrary type which could be unrelated to 'unknown'.
确实,写new Child(22, "hello", "world").genericField 确实不 为字符串提供智能感知,因为genericField 在这里始终是unknown 类型,当我希望它是我传递给它的任何类型时,就像我实例化Parent时一样。
【问题讨论】:
-
请提供一个完整的例子——即实际实例化 Child 并显示您的期望。你的命名也很混乱。为什么
otherStaticType、staticType和genType命名为____type? -
@Inigo 感谢您让我知道我的问题不清楚。我只是用实例化和更好的命名字段对其进行了重大编辑,希望能提供更多的清晰度。
-
@Inigo,我也尝试了很多东西,但都没有奏效。如果您可以考虑改变方法,我想谈谈,但这需要了解确切的业务案例
-
@OleksandrKovalenko 感谢您对此进行调查。我刚刚发布了我自己的答案,这似乎有效,但由于我对某些 TS 类型的一些不确定性,我不能 100% 确定。如果你有时间,请告诉我我的假设是否成立!
标签: typescript generics intellisense