Есть приблизительно такого рода код (сам по себе пример бессмысленный, привожу просто для иллюстрации):
type T1 = {
type: 'number';
parse: (s: string) => number;
stringify: (value: number) => string;
}
type T2 = {
type: 'boolean';
parse: (s: string) => boolean;
stringify: (value: boolean) => string;
}
type T12 = T1 | T2;
function f(p: T12) {
return p.stringify(p.parse('a'));
}
На вызове p.stringify получаю ошибку "Argument of type 'number | boolean' is not assignable to parameter of type 'never'. Type 'number' is not assignable to type 'never'."
Условно говоря, мне нужно написать внутри функции f() некий обобщенный код, который вызывал бы метод p.stringify, но не понимаю, как это сделать, как здесь избавиться от never?
Если написать так:
function f(p: T12) {
if( p.type === 'boolean') {
return p.stringify(p.parse('a'));
}
return p.stringify(p.parse('a'));
}
то ошибки нет, тут понятно, что под if-ом тип параметра функции stringify однозначно вывелся как boolean, а ниже if-а - по остаточному принципу как number.
Но что делать, если хочется написать обобщенный код?