Я получаю сообщение об ошибке типа при использовании адаптера, как в этом сокращенном примере (см. последнюю строку метода getGloryOfAnimal
). Я озадачен, потому что, насколько я могу судить, типы полностью раскрыты.
interface ICheetah {
pace: string;
}
interface ILion {
mane: string;
}
let LionAdapter = {
endpoint: 'lion',
castRawData: (d: any) => d as ILion,
getValue: (d: ILion) => d.mane
}
let CheetahAdapter = {
endpoint: 'cheetah',
castRawData: (d: any) => d as ICheetah,
getValue: (d: ICheetah) => d.pace
}
type AnimalAdapter = typeof CheetahAdapter | typeof LionAdapter;
function getDataFromEndpoint(endpoint: string): any {
// data comes back in a format from the server
// synchronous here for simplicity
if (endpoint === 'cheetah') {
return {
pace: 'lightning speed'
};
} else {
return {
mane: 'shiny mane'
};
}
}
function getGloryOfAnimal(adapter: AnimalAdapter): string {
let data = adapter.castRawData(getDataFromEndpoint(adapter.endpoint));
// type error below:
// 'cannot invoke expression whose type lacks a call signature'
return adapter.getValue(data);
}
console.log(getGloryOfAnimal(LionAdapter));
Я считаю, что мог бы написать интерфейс для двух адаптеров, а не создавать тип объединения (например, (T | U)
), но в моем случае интерфейс был бы очень большим.
Мысли? Я застрял с созданием огромного общего интерфейса для адаптеров?