如何解决将静态属性的类型设置为实例类型的数组
我有一个 Foo
类,它有一个静态 instances
属性保存对所有创建的实例的引用。然后,我有一个类 Bar
扩展 Foo
:
class Foo {
static instances: Foo[];
fooProp = "foo";
constructor() {
let ctor = this.constructor as typeof Foo;
ctor.instances.push(this);
}
}
class Bar extends Foo {
barProp = "bar";
}
然而,Bar.instances
的类型是Foo[]
,而不是Bar[]
,导致如下错误:
let foo = new Foo();
let bar = new Bar();
Foo.instances[0].fooProp; // works
Bar.instances[0].barProp; // Property 'barProp' does not exist on type 'Foo'. ts(2339)
我尝试将 InstanceType<this>
用于 instances
的类型,但它仍然不起作用:
class Foo {
static instances: InstanceType<this>[]; // A 'this' type is available only in a non-static member of a class or interface. ts(2526)
...
}
看起来我的问题与 TypeScript 存储库中关于多态“this”的 this issue 相关。这是真的吗,我想做的事情目前是不可能的,或者我错过了什么?
解决方法
TypeScript 已正确识别错误。 在您的情况下,静态实例数组将包含 Foo 和 Bar 的实例。
考虑将其添加到您的示例中并检查日志:
console.log(Foo.instances[0] instanceof Foo); // true
console.log(Foo.instances[0] instanceof Bar); // false,barProp will not exist on this instance
console.log(Foo.instances[1] instanceof Foo); // true
console.log(Foo.instances[1] instanceof Bar); // true,barProp would be 'bar'
如果要将 Foo 的所有实例存储在一个数组中,并将 Bar 的所有实例存储在另一个数组中,则需要覆盖 Bar 类中的 static instances
:
class Bar extends Foo {
static instances: Bar[] = []
barProp = 'bar';
}
console.log(Foo.instances.length); // 1
console.log(Foo.instances[0].fooProp); // 'foo'
console.log(Bar.instances.length); // 1
console.log(Bar.instances[0].barProp); // 'bar'
,
那个 Bar 正在扩展 Foo 并不意味着已经声明的变量改变了它们的类型。因此,静态变量 'instance' 将始终是 Foo[] 类型,因为您在 Foo 类中将其声明为类型。 我认为“this”不起作用,因为“this”指的是一个对象,而在静态上下文中,它们不是 this 可以指向的对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。