代码之家  ›  专栏  ›  技术社区  ›  Auth Infant

是否可以向typescript中的iterable<t>接口添加方法?

  •  1
  • Auth Infant  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   Cooper Buckingham    7 年前

    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)
      }
    }
    
    推荐文章