如何定义 "subclass of class" 类型?
How to define a "subclass of class" type?
class SuperClass { ... }
class SubClass1 extends SuperClass { ... }
class SubClass2 extends SuperClass { ... }
class SubClass3 extends SuperClass { ... }
const foo: ??? = ...
对于 foo
我想给出一个类型,这意味着 foo
是任何 class 扩展 SuperClass
的实例。我知道我可以使用联合类型并列出所有 subclasses 但必须有更好的方法。不知何故 extends
或者怎么做?
更新:
我问这个是因为我有这个问题:
type SomeType = { foo: SuperClass };
public someMethod<T extends SuperClass>() {
const bar: SomeType = ... ;
const someSet: Set<T> = new Set();
someSet.add(bar.foo);
Argument of type 'SuperClass' is not assignable to parameter of type
'T'. 'SuperClass' is assignable to the constraint of type 'T', but 'T'
could be instantiated with a different subtype of constraint
'SuperClass'.
嗯..也许我应该把 Set<T>
改成 Set<SuperClass>
.
这是一种变体:
interface Interface {}
class SuperClass implements Interface{ }
class SubClass1 extends SuperClass { }
const foo: Interface = new SubClass1();
你想达到什么目的? SuperClass
应该适合 ???
。如果你想让它成为 SuperClass 的每个子类的联合:嗯,这是不可能的
如果你真的想要通用类型,我能想到的最接近的答案是:
interface SuperClass {
a: string;
}
type SomeType<T extends SuperClass> = { foo: T };
function someMethod<T extends SuperClass>(bar: SomeType<T>) {
const someSet: Set<T> = new Set();
someSet.add(bar.foo);
}
class SuperClass { ... }
class SubClass1 extends SuperClass { ... }
class SubClass2 extends SuperClass { ... }
class SubClass3 extends SuperClass { ... }
const foo: ??? = ...
对于 foo
我想给出一个类型,这意味着 foo
是任何 class 扩展 SuperClass
的实例。我知道我可以使用联合类型并列出所有 subclasses 但必须有更好的方法。不知何故 extends
或者怎么做?
更新:
我问这个是因为我有这个问题:
type SomeType = { foo: SuperClass };
public someMethod<T extends SuperClass>() {
const bar: SomeType = ... ;
const someSet: Set<T> = new Set();
someSet.add(bar.foo);
Argument of type 'SuperClass' is not assignable to parameter of type 'T'. 'SuperClass' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'SuperClass'.
嗯..也许我应该把 Set<T>
改成 Set<SuperClass>
.
这是一种变体:
interface Interface {}
class SuperClass implements Interface{ }
class SubClass1 extends SuperClass { }
const foo: Interface = new SubClass1();
你想达到什么目的? SuperClass
应该适合 ???
。如果你想让它成为 SuperClass 的每个子类的联合:嗯,这是不可能的
如果你真的想要通用类型,我能想到的最接近的答案是:
interface SuperClass {
a: string;
}
type SomeType<T extends SuperClass> = { foo: T };
function someMethod<T extends SuperClass>(bar: SomeType<T>) {
const someSet: Set<T> = new Set();
someSet.add(bar.foo);
}