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

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

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

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

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

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

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

37 ответов

24 просмотра

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 как один из вариантов тайп гварда. Но он только с юнионами работает

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
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
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
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
Карта сайта