У меня следующая ситуация в машинописном тексте:
type Matcher<T, U> = {
First: (arg: T) => U,
Second: () => U
};
class Main<T> {
constructor(private value: T) {
}
match<U>(matcher: Matcher<T, U>): U {
return this.value
? matcher.First(this.value)
: matcher.Second();
}
}
const main = new Main(10);
const res = main.match({ // there is a problem
First: v => v + 10,
Second: () => console.log()
});
Итак, у меня есть объект, который пользователь должен передать методу match
экземпляра класса. Этот объект должен содержать две функции: First
и Second
. Эта функция возвращает значение одного типа (например, number
) или одного типа + void
(например, number
+ void
), но ничего другого. Не может быть string
+ number
типов.
Этот код не работает с ошибкой
The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidat 'void' is not a valid type argument because it is not a supertype of candidate 'number'.
Я понимаю, почему возникает эта ошибка (U
- это единственный тип, но функции имеют два разных типа, и их нельзя объединять и т. Д.), Но как я могу решить эту проблему? Мне нужно:
- строгая типизация, поэтому не должно быть типа
any
- разрешить использование только одного типа для обеих функций или
void
для одной или обеих.number
иstring
как возвращаемые типы не допускаются.
Можно ли поступить с системой типов машинописного текста?