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

Ну в конкретном случае я на ноде делаю парсинг html,

достаю имя эмоджи и меняю его на текст.

код выглядит примерно так:

const title = $elem.attr('title');

const emojiCode = emojilib.lib[title]?.char || '';

хотелось бы оставить информацию о том, что lib[title] может быть undefined. Вместо этого он даже просто не компеилируется

37 ответов

21 просмотр

const obj = { a: 1, b: 2, } as const; function foo(key?: string) { if (typeof key !== 'string') { return undefined; } const x = key as keyof typeof obj return obj[x]; }

const obj = { a: 1, b: 2, } as const; function getObjProperty(key: keyof typeof obj) { return obj[key]; }

это да, но ему это не подходит, см выше задачу)

если undefined -> значит пустая строка, нужно делать за пределами этой функции, функция у тебя как геттер просто идет

Misha- Автор вопроса

ну так остается та же самая проблема. То есть, если будет объект вложенный, то можно попасть в ситуация ‘xxx of undefined’ const obj = { a: {value: 'key'}, b: {value: 'key'}, } as const; function foo(key?: string) { if (typeof key !== 'string') { return undefined; } const x = key as keyof typeof obj return obj[x].value; } foo('t');

так не надо

return obj[x]?.value;

Ты сам не понимаешь, что должна сделать функциия? Почему у неё название foo?

Misha- Автор вопроса

это просто пример для наглядности. Я выше описал конкретный свой кейс

он попытался абстрацкию дать, чтоб нам не передавать контекст задачи

Misha- Автор вопроса

Это понятно, я просто к тому, что ТС теряет информацию о том, что obj[x] может быть андефайнд и никак не подсказывает, что нужно ?. не забыть

Зачем пытаться пробросить в функцию undefined параметр?

просто эта функция у тебя как геттер, над ней ты можешь юзать другую, которая берет value

Misha- Автор вопроса

пользовательский инпут. Вот конкретный код. Из html достается значение const title = $elem.attr('title') || ''; const emojiCode = emojilib.lib[title]?.char || '';

const title = $elem.attr('title'); function getObjProperty<T>(key: keyof typeof obj, obj: T) { return obj[key]; } let emojiChar; if (title) { emojiChar = getObjProperty(emoji.lib) }

https://www.typescriptlang.org/play?#code/MYewdgzgLgBApgWxAKwJZwjAvDA3gKBiJgHIAuASnLxmAAsBDAJzJgAYAPAFhgF8AaQsXIARarlqMW7DgEYeA-LxgNMoSFHz4AZgFcwwKKnAwA5nCgBRJGgAUiFKgD8raE1RhTFPEKKptMLZQAJ4ADnAgAQ5oMACEWDgkbh6mJN4ExJkwTBa6TGAw+gAmcNoecEW+fFXq0DAA1nDB2PA2qCqYjcGRMCHhPdHoEFU5UHkFgxgA2l0AukpatbBGUAA2cC3FpeWV+EutjgDCICUt5lZtQahrcBROAHT0zDAAPi+kJPhAA

нет, только не let с мутацией через if))

Не понял

это усложняет код, когда можно этого не делать

Это правильное написание. Понятно, что делает функция и понятно, что на выходе

это неправильно написание, я за такое своих разрабов по рукам бью)

Ну, сочувствую твоим разрабам)

ну они рады, что теперь их код стал более поддерживаемый

Misha- Автор вопроса

Если честно, то это похоже немного на тайпскриптовый костыль. То есть ты эмулируешь возможный андефайнд в return засчет того, что добавляешь проверку if (typeof !== ‘string). Хотя туда всегда приходит строка, просто под нее может не быть значения в объекте

ну не совсем по сути когда ты валидируешь что-то, ты всегда в типизированном языке говоришь "вот это, воспринимай вот так" даже если ты пишешь на хаскеле

typeof для кей всегда избыточек, потому что туда можно закинуть или udefined или string. Проверки на undefined достаточно всегда)

https://www.typescriptlang.org/play?ssl=16&ssc=6&pln=11&pc=5#code/MYewdgzgLgBApgWxAKwJZwjAvDA3gKBiJgHIAuASnLxmAAsBDAJzJgAYAPAFhgF8AaQsXIARarlqMW7DgEYeA-LxgNMoSFHz4AZgFcwwKKnAwA5nCgBRJGgAUiFKgD8raE1RhTFPEKKptMLZQAJ4ADnAgAQ5oMACEWDgkbh6mJN4ExJkwTBa6TGAw+gAmcNoecEW+fFXq0DAA1nDB2PA2qCqYjcGRMCHhPdHoEDXgdQBuDAA2unAtgxgA2l0AulX+gRPTcOlVmTlQeQWbM1XKcJMQsxlZRPuHhWAlZWAVp0patbBGUJOzOMWlcqVfCfVqOADCIBKLXMVjaQVQP22TgAdPRmDAAD6Y0gkfBAA можешь так сделать, если нагляднее будет

const key = emoji as keyof typeof emojies :DDDD

Нечитаемо, не поддерживаемо, не тестируемо

нетестируемо? шта? неподдерживаемо? с чего бы? с читабельностью да, проблема, тип вынес и все

Misha- Автор вопроса

Мне кажется такой вариант более валидный и безопасный с точки зрения типов Playground

тож сойдет

Misha- Автор вопроса

нашел подходящее решение через тайпгарды: Playground:

ну я сразу про тайп гварды написал))

Misha- Автор вопроса

так а чего пример с ними не сделал ?))) Я просто забыл про is и расценивал in как один из вариантов тайп гварда. Но он только с юнионами работает

черт его знает почему)

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
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
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта