在这个简化的示例中使用适配器时,我收到一个类型错误(参见方法的最后一行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)
),但在我的情况下,接口会非常大。
想法?我是否坚持为适配器创建一个巨大的通用接口?