Немедленная проверка статической стороны класса во время реализации с Typescript - PullRequest
3 голосов
/ 06 мая 2019

Я нахожусь в следующей ситуации с двумя общими интерфейсами очереди: один для стороны экземпляров, а другой для статической стороны классов, которые будут реализовывать интерфейс:

export interface Queue<T> {
  // instances stuff
}

export interface QueueConstructor<T> {
  new(arrayOfT?: Array<T>): Queue<T>;
  // static stuff
}

Я быхотел бы проверить, правильно ли реализация реализует статическую сторону, прямо на этапе реализации.Я не хочу использовать первый обходной путь, представленный в документации , а второй, из-за обобщений, кажется, непригодным для использования.

Может быть, есть способ сделать это с помощью декораторов,но я не могу найти правильное решение.

1 Ответ

3 голосов
/ 06 мая 2019

Обобщения могут использоваться с функцией, которая выполняет подход проверки, в идеале вы должны использовать обобщения для сохранения любых других членов, объявленных в новом классе:

export interface Queue<T> {
  push(item: T): Queue<T>;
}

export interface QueueConstructor<T> {
  new(arrayOfT?: Array<T>): Queue<T>;

}

function checkQueue<T extends QueueConstructor<any>>(cls: T): T{
  return cls;
}

const myQueue = checkQueue(class <T> {
  constructor(public arrayOfT?: Array<T>) {

  }
  push(item: T): Queue<T>{
    return this;
  }
})

new myQueue<number>();

const myBadQueue = checkQueue(class <T> { // err
  constructor(length: number) {

  }
  push(item: T): Queue<T>{
    return this;
  }
})

Эта точно такая же функция может также использоваться какдекоратор и он будет отмечать те же проблемы

function checkQueue<T extends QueueConstructor<any>>(cls: T): T{
    return cls;
}

@checkQueue
class myQueue<T> {
    constructor(public arrayOfT?: Array<T>) {

    }
    push(item: T): Queue<T>{
    return this;
    }
}

new myQueue<number>();

@checkQueue // err
class myBadQueue<T> { 
    constructor(length: number) {

    }
    push(item: T): Queue<T>{
    return this;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...