169 похожих чатов

Приветики Пришёл с глупым вопросом.. Подскажите, есть ли возможность затипизировать функцию

с конкретным значением на выходе?

Что-нибудь типа такого:

type SomeFn = (v: string | null) => NaN | number;

Такой код, соответственно, не работает, есть ли варианты сделать то, что я хочу?)

21 ответов

25 просмотров

number уже включает в себя NaN. Это всё равно, что писать 'a' | 'b' | string

Yuri-Kostin Автор вопроса

Я понимаю. Но окей, на самом деле у меня вот такая сигнатура на выходе: Either<NaN, number>

Yuri-Kostin Автор вопроса

Точнее такую бы я хотел. Но видимо, без вариантов..

А можешь уточнить вопрос? Пример-то вроде вполне рабочий, но он что-то делает не как ожидается?

Yuri-Kostin Автор вопроса
Yuri-Kostin Автор вопроса

Что вполне логично и ожидаемо. Но вот я что-то сижу и не понимаю, как мне сделать хотя бы приближенно к тому, что хочется

ну, об этом компилятор и говорит: type Test = typeof NaN // number Вам скорее Option нужет, а не Either

да, действительно, кажется NaN вываливается за границы типизации TS. Попробуй использовать null вместо NaN?

Yuri-Kostin Автор вопроса

Ну, кстати, учитывая, что функция у меня претерпела изменения, наверное, можно и Option использовать.. Но прикол был в том, что я хотел сделать вот так type ParseNumber = (input: string | null) => Either<null | NaN, number>;

ничто вас не спасёт от того, что NaN имеет number тип, а значит Right(NaN) вполне валидное в рантайме значение (с точки зрения ТС/джс) Со строками, кстати, тоже такое не прокатит type NotA = Exclude<string, 'a'> // string (не исключает значения 'a')

Про исключение конректных значений понятно. Жалко, что оно NaN не хочет как Union type из одного варианта понимать

Наверное, должен быть ишью. Чем НаН хуже или лучше других значений намбера?.. Может, специфика, что НаН !== НаН?

Yuri-Kostin Автор вопроса

Вот так в итоге написал 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/

Yuri-Kostin Автор вопроса

Ух жёсткое что-то, спасибо большое)

Yuri-Kostin Автор вопроса

О, чёт даже не искал перевод. Спасибо, прочитаю ещё раз. Статья просто огонь

просто брендирование с рантайм проверками

согласен

Yuri-Kostin Автор вопроса

Не так я пока силён в TS)

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

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта