Вывод типа параметра нарушает пересечение? - PullRequest
1 голос
/ 25 апреля 2020

В приведенном ниже коде, если вывод типа используется для параметра 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, которая не была причиной проблемы, но была в более старой версии образца.

...