Typescript:创建一个类作为泛型父类的泛型扩展

时间:2017-12-01 17:06:16

标签: typescript generics

假设我有一个通用基类和一个基接口:

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”)。但在这里,它被称为“无关”的承诺,没有来自编译器的抱怨。

我对遗传学有什么看法?如何从泛型父类派生泛型类并将泛型类型约束为基类型的“子类型”?

我希望我的问题很明确。

1 个答案:

答案 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

    }
}