假设我有一个通用基类和一个基接口:
interface IBase{
// empty
}
class Base<T extend IBase> {
someFunction<T>():T {
return null;
}
}
interface IChild extends IBase {
child_value: string
}
// this is generic class derived from the Base class
class Child<S extends IChild> extends Base<S> {
// this function does not exists in base but
// calls an inherited generic function
doSomeThing(){
this.someFunction({
irrelevant: 'foo'
})
}
}
我不明白为什么上面的代码编译得很好。我在想,当从子对象(Child)调用“someFunction”时,它只会被限制为IChild类型的对象(具有属性“child_value”)。但在这里,它被称为“无关”的承诺,没有来自编译器的抱怨。
我对遗传学有什么看法?如何从泛型父类派生泛型类并将泛型类型约束为基类型的“子类型”?
我希望我的问题很明确。
答案 0 :(得分:1)
在你的例子中唯一可能会让你失望的是你在该基类中有两个T
的上下文。
为类T
输入IBase
:
class Base<T extends IBase> {
该方法的类型T
没有类型约束:
someFunction<T>(): T {
如果您希望函数具有类中的类型,则不需要类型参数:
someFunction(): T {
这是一个带注释的代码示例:
interface IBase{
// empty
}
class Base<T extends IBase> { // <-- extends, not extend
someFunction():T { // <-- we can use T from the class if that's what you intend, so no type parameter here
return <any>null; // return <any>null; as otherwise T must be null
}
}
interface IChild extends IBase {
child_value: string
}
// this is generic class derived from the Base class
class Child<S extends IChild> extends Base<S> {
// this function does not exists in base but
// calls an inherited generic function
doSomeThing() {
const x = this.someFunction();
return x.child_value; // <-- x.child_value autocompletion and type checking
}
}