достаю имя эмоджи и меняю его на текст.
код выглядит примерно так:
const title = $elem.attr('title');
const emojiCode = emojilib.lib[title]?.char || '';
хотелось бы оставить информацию о том, что lib[title] может быть undefined. Вместо этого он даже просто не компеилируется
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 -> значит пустая строка, нужно делать за пределами этой функции, функция у тебя как геттер просто идет
ну так остается та же самая проблема. То есть, если будет объект вложенный, то можно попасть в ситуация ‘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?
это просто пример для наглядности. Я выше описал конкретный свой кейс
он попытался абстрацкию дать, чтоб нам не передавать контекст задачи
Это понятно, я просто к тому, что ТС теряет информацию о том, что obj[x] может быть андефайнд и никак не подсказывает, что нужно ?. не забыть
Зачем пытаться пробросить в функцию undefined параметр?
пользовательский инпут. Вот конкретный код. Из 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))
Не понял
это усложняет код, когда можно этого не делать
Это правильное написание. Понятно, что делает функция и понятно, что на выходе
это неправильно написание, я за такое своих разрабов по рукам бью)
Ну, сочувствую твоим разрабам)
ну они рады, что теперь их код стал более поддерживаемый
Если честно, то это похоже немного на тайпскриптовый костыль. То есть ты эмулируешь возможный андефайнд в 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
Нечитаемо, не поддерживаемо, не тестируемо
нетестируемо? шта? неподдерживаемо? с чего бы? с читабельностью да, проблема, тип вынес и все
Мне кажется такой вариант более валидный и безопасный с точки зрения типов Playground
тож сойдет
нашел подходящее решение через тайпгарды: Playground:
ну я сразу про тайп гварды написал))
так а чего пример с ними не сделал ?))) Я просто забыл про is и расценивал in как один из вариантов тайп гварда. Но он только с юнионами работает
черт его знает почему)
Обсуждают сегодня