Можно ли применить перегрузки функции TypeScript на основе типа класса параметра?
Я понимаю, что "классы" будут скомпилированы в простые функции в выводе, но я надеюсь, чтозаставить проверку типа работать в зависимости от типа ввода.
Цель состоит в том, чтобы создать функцию send()
для связи с сервером, которая возвращает типизированный ответ на основе типа запроса.Тем не менее, TypeScript всегда выбирает первую перегрузку независимо от типа передаваемого класса.
interface IRequest {
getBody(): object;
}
class UserRequest implements IRequest {
getBody() {
return { type: 'user', id: 7 };
}
}
class CompanyRequest implements IRequest {
getBody() {
return { type: 'company', id: 42 };
}
}
interface IUserResponse {
userName: string;
}
interface ICompanyResponse {
companyName: string;
}
function send(request: UserRequest): Promise<IUserResponse>;
function send(request: CompanyRequest): Promise<ICompanyResponse>;
async function send(request: IRequest): Promise<any> {
const response = await fetch('https://example.com/service', {
body: request.getBody(),
});
return response.json();
}
async function test() {
// Works
const userResponse = await send(new UserRequest());
userResponse.userName;
// Error: [ts] Property 'companyName' does not exist on type 'IUserResponse'. [2339]
const companyResponse = await send(new CompanyRequest());
companyResponse.companyName;
}
Смена порядка объявленных перегрузок устраняет проблему (тип возвращаемого значения всегда будет CompanyRequest
вместоUserRequest
).