с конкретным значением на выходе?
Что-нибудь типа такого:
type SomeFn = (v: string | null) => NaN | number;
Такой код, соответственно, не работает, есть ли варианты сделать то, что я хочу?)
number уже включает в себя NaN. Это всё равно, что писать 'a' | 'b' | string
Я понимаю. Но окей, на самом деле у меня вот такая сигнатура на выходе: Either<NaN, number>
Точнее такую бы я хотел. Но видимо, без вариантов..
А можешь уточнить вопрос? Пример-то вроде вполне рабочий, но он что-то делает не как ожидается?
Что вполне логично и ожидаемо. Но вот я что-то сижу и не понимаю, как мне сделать хотя бы приближенно к тому, что хочется
ну, об этом компилятор и говорит: type Test = typeof NaN // number Вам скорее Option нужет, а не Either
да, действительно, кажется NaN вываливается за границы типизации TS. Попробуй использовать null вместо NaN?
Ну, кстати, учитывая, что функция у меня претерпела изменения, наверное, можно и Option использовать.. Но прикол был в том, что я хотел сделать вот так type ParseNumber = (input: string | null) => Either<null | NaN, number>;
ничто вас не спасёт от того, что NaN имеет number тип, а значит Right(NaN) вполне валидное в рантайме значение (с точки зрения ТС/джс) Со строками, кстати, тоже такое не прокатит type NotA = Exclude<string, 'a'> // string (не исключает значения 'a')
Про исключение конректных значений понятно. Жалко, что оно NaN не хочет как Union type из одного варианта понимать
Наверное, должен быть ишью. Чем НаН хуже или лучше других значений намбера?.. Может, специфика, что НаН !== НаН?
Вот так в итоге написал const parseNumber: ParseNumber = (input) => pipe( either.fromNullable(new Error('Empty input'))(input), either.map(parseInt), either.filterOrElse( value => !isNaN(value), () => new Error('Input must be a number'), ) );
кажется в этой сигнатуре null вообще лишний
я бы примерно так сделал если очень нужно
https://habr.com/ru/post/498042/
Ух жёсткое что-то, спасибо большое)
О, чёт даже не искал перевод. Спасибо, прочитаю ещё раз. Статья просто огонь
просто брендирование с рантайм проверками
согласен
Не так я пока силён в TS)
Обсуждают сегодня