是否可以在TypeScript中向Iterable <t>接口添加方法?

时间:2018-12-11 00:04:35

标签: typescript

我已阅读并使用以下代码成功将成员添加到Array接口:

interface Array<T> {
    first(): T | undefined;
}

Array.prototype.first = function<T>(this: T[]): T | undefined {
    return this.length > 0 ? this[0] : undefined;
};

但是,如果我尝试对Iterable接口执行相同操作,则无法正常工作:

interface Iterable<T> {
    first(): T | undefined;
}

Iterable.prototype.first = function <T>(this: Iterable<T>): T | undefined {
    return undefined;
}

TS编译器返回有关我尝试修改Iterable原型的行的错误:

'Iterable' only refers to a type, but is being used as a value here.

是否可以向Iterable添加方法?谢谢!

1 个答案:

答案 0 :(得分:1)

Iterable是一个接口。它的全部意思是“实现此接口的东西一定要具有接口说的东西”。但是界面本身不是问题。

如果您修改接口,那么唯一会做的就是在编译时在代码中向您展示实现该接口的东西执行不正确。

以下是您可以做的一些事情,只是将您放在头脑中: 声明一个新接口,并使所有代码都符合该接口。声明一个新类,并赋予它所需的所有行为。或创建一个静态帮助器类,方法是将现有Iterable的实例传递给它。

interface Iterable {
  propA: string;
  propB: string;
}

interface MyIterable<T> extends Iterable {
  propC: string;
  first: T;
  forEach: () => void;
}

class MyClassIterable<T> implements Iterable<T> {
  propA: string;
  propB: string;

  [Symbol.iterator] (): Iterator<T> {
    //
  }

}

class MyClassForMyIterable<T> implements MyIterable<T> {
  propC: string;
  first: T;
  propA: string;
  propB: string;

  [Symbol.iterator] (): Iterator<T> {
    //
  }

  forEach (): void {
    //
  }

  get first(): T | null {
    //
  }

}

abstract class IterationHelper {
  static first<T> (iterable: Iterable): T {
    return (some value from iterable)
  }
}