Я пишу универсальные методы, чтобы использовать их в различных приложениях веб-интерфейса, и идея состоит в том, чтобы иметь возможность вызывать функцию .postAsync<CustomModel>('www.mysite.com',..., CustomModel);
, а предполагаемый ответ - объект CustomModel.
Я быхотелось бы иметь возможность установить значение по умолчанию для второго параметра, так что по умолчанию это будет другая модель, которую можно будет переопределить при необходимости.
Как установить значение по умолчанию для аргумента, которыйимеет тип Constructable<T>
, где интерфейс Construable означает
interface Constructable<T> { new(params : any): T ;}
Я попытался установить значение по умолчанию для интерфейса, который принимает аргумент, и установить аргумент для различных типов, но я всегда получаю ошибку Type Constructable<CustomModel> is not assignable to type Constructable<T>
.Я также установил тип T по умолчанию в методе, общем для CustomModel, а затем попробовал это и получил ту же ошибку.
interface Constructable<T> { new(params : any): T ;}
export default class WebapiBase {
static async postAsync<T = CustomModel>(
uri: string,
body: object,
headers: CustomHeaders = new CustomHeaders(),
// This is the part giving errors
model: Constructable<T> = <Constructable<CustomModel>>,): Promise<T> {
return this.requestAsync<T>(model, HTTP_METHOD.POST, uri, headers, body);
}
private static async requestAsync<T>(
model: Constructable<T>,
method: HTTP_METHOD,
uri: string,
headers: CustomHeaders,
body?: object): Promise<T> {
const url = new URL(uri, window.location.origin);
const request = this.buildRequest(url, method, headers, body);
const bodyResponse = await fetch(request)
.then(response => this.validate(response, request.headers))
.then(validResponse => this.extractBody(validResponse))
// Here is where the response body is being used to initialise one of the custom models that we are passing in. Code below
.then(extractedBody => this.buildModel<T>(model, extractedBody))
.catch((error) => { throw this.handleError(error); });
return bodyResponse;
}
private static buildModel<T>(
Model: Constructable<T>,
params: ResponseBody,
): T {
return new Model(params);
}
}
Я ожидал, что мне не нужно будет передавать модель в метод postAsync()
и что он всегда будет возвращать объект CustomModel.Но в действительности я получаю эту ошибку Type Constructable<CustomModel> is not assignable to type Constructable<T>
Пример на игровой площадке, наведите курсор мыши на Constructable в аргументах, чтобы увидеть ошибку