具有泛型类型的 Angular2 / TypeScript 类继承

1 inheritance types class typescript angular

希望你们中的一位Angular2 / TypeScript 向导能够在我发疯之前提供帮助,或者至少提供一个正确方向的指针:-)

这就是我想要的

  • 有一个实现它自己定义的父接口的父类,但是使用通用类型,这样我就可以在创建子类时为其提供子类的特定且定制的类和数据接口。
  • 子类应该能够通过以下方式扩展父数据类
    • 能够覆盖默认/父集变量
    • 覆盖父函数()并调用子版本而不是父版本的默认版本

在下面的伪代码示例中,我希望对子级(继承的)的调用someOtherfunction()返回“2”...

我的要求是不是太多了?我似乎在网上找不到任何合适的例子......

我怎样才能做到这一点?

谢谢你-奥利弗

(下面的代码可能已损坏,仅供说明)

// 
// Parent Class
// 

export interface ICoreData <T> {
    observeItems: Observable <T[]> ;
    items: Array <T>;
}

@Injectable()
export class CoreData<T> implements ICoreData<T> {

    public observeItems: Observable<T[]>;
    private items: Array<T>;

    constructor( 'Dependency Injection...' ) {}

    coreFunction(): number {
        return 1;
    }
    someOtherfunction(){
        return this.coreFunction();
    }
}

// 
// Child class
// 

export interface IMyDataStructure {
    name: string;
    age: string;    
}

export interface ISpecificData extends ICoreData<IMyDataStructure> {
    someExtraKey: number;
}

@Injectable()
export class SpecificData extends CoreData<IMyDataStructure> implements ISpecificData {

    constructor() {
        super();
    }

    coreFunction(): number{
        // 
        // This function should "overwrite" the parent's original function 
        // and be called by the parent's someOtherfunction() function 
        // 
        return 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ing 5

你要求不过分。但是,您不能使用interfaces 来完成您想要完成的任务。您需要扩展 a class,它可以是通用的。

Aninterface只是数据类型的契约或蓝图(如果您愿意的话)。没有与 相关的功能interface。但是,在您的情况下,您希望能够在基类上拥有方法;您可以在派生中重写的方法。

我通常这样做的方法是声明一个abstract基类(以便基类本身无法实例化),然后从中extend声明类。这是一个例子:

请注意,我已经删除了所有 Angular2 的缺陷,以使示例尽可能简单。

abstract class Base<T> {
  constructor(public controlled: T) { }

  doIt(): string {
    return `Base.doIt: ${JSON.stringify(this.controlled)}`;
  }

  doSomethingElse(): string {
    return `Base.doSomethingElse: ${JSON.stringify(this.controlled)}`;
  }
};

interface Foo {
  foo: string;
  bar: string;
};

class Derived extends Base<Foo> {
  constructor(foo: Foo) {
    super(foo);
  }

  doSomethingElse(): string {
    return `Derived.doSomethingElse: ${JSON.stringify(this.controlled)}`;
  }
};

let d: Derived = new Derived({ foo: 'foo', bar: 'bar' });

console.log(`doIt ==> ${d.doIt()}`);
console.log(`doSomethingElse ==> ${d.doSomethingElse()}`);
Run Code Online (Sandbox Code Playgroud)

输出:

doIt ==> Base.doIt: {"foo":"foo","bar":"bar"} 
doSomethingElse ==> Derived.doSomethingElse: {"foo":"foo","bar":"bar"}
Run Code Online (Sandbox Code Playgroud)

游乐场链接