#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
}