@pep76

Как избавиться от ошибки «Argument of type 'xxx | yyy' is not assignable to parameter of type 'never'»?

Есть приблизительно такого рода код (сам по себе пример бессмысленный, привожу просто для иллюстрации):
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.
Но что делать, если хочется написать обобщенный код?
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Если хочется написать обобщенный код, то не надо себя сдерживать! Просто напиши обобщенный код.

type TGen<T> = {
    parse: (s: string) => T;
    stringify: (value: T) => string;
}

function f<T>(p: TGen<T>) {
    return p.stringify(p.parse('a'));
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы