Функция, возвращающая класс, реализующий интерфейс: отсутствуют свойства

#typescript #nestjs

#typescript #nestjs

Вопрос:

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

 export interface A<T>{
  list(): Promise<T>
}

export function Factory<T>(): A<T> {
  class AHost implements A<T>{
    async list() {
      return {} as any
    }
  }
  return AHost
}
  

но я получаю следующую ошибку:

 Property 'list' is missing in type 'typeof AHost' but required in type 'A<T>'.
  

несмотря на то, что list определено на AHost . Это сильно вдохновлено выступлением автора NestJS. Я не могу использовать его 1 к 1, потому что при использовании Type я получаю TS2315: Type 'Type' is not generic. сообщение об ошибке.

Общая картина такова: я хочу создать абстрактную службу с EntityClassOrSchema (Typeorm) в качестве входного аргумента для функции factory, чтобы я мог легко создавать службы для различных объектов.

Комментарии:

1. Вы возвращаете класс , а не экземпляр . return new AHost() будет работать нормально, потому что это реализация экземпляра A<T> . В качестве альтернативы, если вы хотите вернуть класс, будет работать возвращаемый тип, например { new(): A<T> } .

2. Это было быстро. Спасибо.

3. Наличие возвращаемого типа classstype<A<T>> работает для меня.

4. Я не знаю, что такое classstype, но вы можете видеть typescriptlang.org/docs/handbook / … для получения информации о статической стороне и стороне экземпляра классов.

5. Это export declare type ClassType<T> = { new (...args: any[]): T; }; пакет из класса-трансформера. Извините, я не заметил, откуда это взялось. 🙂

Ответ №1:

Ваш заводской интерфейс ожидает экземпляр A, но не класс A

Вы должны изменить свой заводской тип на что-то вроде этого

 export interface A<T>{
  list(): Promise<T>
}
// add type of class there
export type B<T> = new () => A<T>

export function Factory<T>(): B<T> {
  class AHost implements A<T>{
    async list() {
      return {} as any
    }
  }
  return AHost
}