#node.js #angular #typescript #types #typescript-generics
Вопрос:
Не так уж и ново для машинописи, но, может быть, достаточно ново? И здесь я озадачен.. Я ожидал некоторых ошибок компилятора и не получил их. Я что-то упускаю?
(Лучший/управляемый пример находится здесь, на игровой площадке TS: Ссылка на игровую площадку )
type Context<T> = {
data:any,
};
type EventNames = "beforeSave" | "afterSave" | "beforeDelete" | "afterDelete";
type EventHandler<T> = (context:Context<T>, next:()=>{})=>Promise<any>;
type EntityModel<T> = {
observe:(eventName:EventNames, handler:EventHandler<T>)=>void;
}
type OnlineShoppingCart ={
[key: string]:any
}
const model:EntityModel<OnlineShoppingCart> = {
observe: (eventName:EventNames)=> {
// why am I not getting a compiler error here?
// observe is not properly implemented!
}
};
model.observe('beforeSave', async ()=>{
// why am I not getting a compiler error here?
//This arrow function does not properly implement EventHandler<T>
})
Комментарии:
1. Как вы думаете, почему эти типы не реализованы должным образом? Вы имеете в виду, что он не принимает аргументы? Javascript-это не java, здесь, если функция не принимает никаких аргументов, вы все равно можете вызвать ее с помощью некоторых, и это не будет ошибкой во время выполнения. Таким образом, вы можете опустить аргументы, которые вы не используете. Смотрите это в документах TS
2. Чтобы добавить в комментарий @AlexChashin, если функция наблюдения будет несовместима (например, она будет принимать параметры другого типа), это будет ошибкой. Таким образом, он просто явно не учитывает «неиспользуемые» параметры (некоторые конфигурации lint даже предлагают это сделать), но тип ввода
model.observe
является исходным полным типом (что хорошо, ИМХО) независимо от реализации.