Как я могу вызвать универсальную функцию только с одним универсальным параметром, когда второй нужен на лету?

У меня есть общая функция с двумя параметрами. Второй основан на значении первого параметра.

Код работает только с одной переменной типа, но когда я добавляю другую, не могу вызвать функцию.

Это работает отлично:

type Event<T> = T extends 'string' ? string : number;
type input = 'string' | 'number';

function test<U extends input>(module: U, event: Event<U>) {
  //...
}

//No errors
test('number', 2);

// Generates error as expected
test('string', 2);

Но когда требуется другая общая переменная, возникает ошибка:

type Event<T> = T extends 'string' ? string : number;
type input = 'string' | 'number';

function test<T, U extends input>(module: U, event: Event<U>) {

  // The subject factory returns a new Rxjs Subject
  return subjectFactory<T>(module + '-' + event);
}

// Works without any generic parameter
const s1 = test('number', 2);

// Expected 2 type arguments, but got 1
const s2 = test<MyType>('number', 2);

Мне нужно вызвать функцию без второго общего параметра. Как?


person rostamiani    schedule 01.07.2020    source источник
comment
Я считаю, что частичный вывод типов — это WIP: github.com/microsoft/TypeScript/issues/26242. В этом случае кажется странным иметь внутренний общий тип, не связанный с типами параметров, — что может привести к его изменению?   -  person jonrsharpe    schedule 01.07.2020
comment
@jonrsharpe Это мой предыдущий вопрос, который решен, но мне нужен дополнительный общий параметр: stackoverflow.com/questions/62672550   -  person rostamiani    schedule 01.07.2020
comment
Да, я знаю; Я прокомментировал оба из них. Мой вопрос: почему вам нужен этот дополнительный параметр? Как тип должен измениться внутри функции таким образом, чтобы это не зависело от типа параметра или возвращаемого значения?   -  person jonrsharpe    schedule 01.07.2020
comment
Моя реальная функция добавляет новый Rxjs Subject<T> в локальный массив. Затем я должен передать тип T, чтобы определить тему внутри функции.   -  person rostamiani    schedule 01.07.2020
comment
Пожалуйста, отредактируйте вопрос, чтобы указать контекст - откуда взялся этот T, к каким другим типам он относится?   -  person jonrsharpe    schedule 01.07.2020
comment
@jonrsharpe, спасибо. Вы правы, есть проблема. В реальном мире решение не работает. Я добавил здесь более реалистичный пример: -first" title="определение второго параметра как условного типа на основе значения первого"> stackoverflow.com/questions/62672550/   -  person rostamiani    schedule 01.07.2020
comment
Пожалуйста, не переключайтесь между двумя вопросами и не редактируйте, как только вы получили ответ. Здесь кажется, что субъект всегда будет string, поэтому не совсем понятно, зачем нужен общий тип.   -  person jonrsharpe    schedule 01.07.2020