Создание mixin интерфейсов в Typescript

у меня есть класс с более чем 80 методами, и каждый метод принимает объект, содержащий определенный интерфейс.

class Stuff {
   /* many more */
   getAccount(req: IAccount, callback: ICallback) {
      return this._call('getAccount', req, callback);
   }

   getIds(req: IIDs, callback: ICallback) {
      return this._call('getIds', req, callback);
   }
   /* many more */
}

довольно "скучные" вещи, так как это просто отображение в подложку _call метод и сделать его безопасным для каждого из методов.

но иногда эти req объекты param состоят из 2 или более интерфейсов, и вместо создания другого интерфейса для каждого раза есть "неудобный", например:

export interface ILoled extends IAccount {
   loled: boolean;
}

export interface IRofloled extends ILoled {
   rofled: boolean;
}

class Stuff {
  getLols(req: ILoled){
  }

  getRofls(req: IRofloled){
  }
}

is есть ли способ, которым я могу просто поместить его как "встроенный" mixin интерфейсов внутри списка параметров метода? Как (которые, очевидно, не работают):

class Stuff {
  getMoreStuff(req: <{} extends IAccount, ITime>) {
  }
}

2 ответов


Да, вы можете, по состоянию на Typescript 1.6. Называется типы пересечении используйте & оператор для объединения типов.

function extend<T, U>(first: T, second: U): T & U {
  let result = <T & U> {};
  for (let id in first) {
    result[id] = first[id];
  }

  for (let id in second) {
    if (!result.hasOwnProperty(id)) {
      result[id] = second[id];
    }
  }
  return result;
}

var x = extend({ a: "hello" }, { b: 42 });
x.a; // works
x.b; // works 

есть ли способ, которым я могу просто поместить его как "встроенный" mixin интерфейсов внутри списка параметров метода

нет. Нельзя расширения встроенный интерфейс