В приведенном ниже коде, если вывод типа используется для параметра do
, система типов молча не может создать запрошенное пересечение типов (т.е. я ожидаю, что функция create
возвращает пересечение Obj
и M
но если я использую вывод типа в параметре do
, я просто получаю Obj
). Это ошибка компилятора TS или я что-то неправильно понимаю?
type Effect<T, M> = {
// NOTE: The problem seems to be here somewhere. Getting rid of the
// intersection `& M` below gets rid of the error.
do?: (o: T & M) => void;
};
type Obj = {};
function create<T, M>(params: {
methods: M;
effect: Effect<T, M>;
}): Obj & M {
return params.methods
}
const obj = create({
// If the parameter below is inferred then the Obj type
// breaks and the methods are no longer merged in.
// If a type is given (e.g. `obj:any`) the methods work
// as expected
effect:{do: (obj) => {}},
methods: {
something() {}
}
});
// This will be an error if the effect infers the parameter type
obj.something();
Вот игровая площадка TS, если вы хотите с ней повозиться
Редактировать: Снизить код и сосредоточить вопрос. В комментариях есть ссылка на ThisType
, которая не была причиной проблемы, но была в более старой версии образца.