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

Всем привет! Есть функция (fn) которая на вход принимает стринг

(typescript)
Есть условие
const result = text?.trim() ? fn(text) : 'empty' - все отлично работает и все хорошо, но если я пытаюсь вынести text?.trim() в переменную isTextExist = text?.trim() и делаю

const result = isTextExist ? fn(text) : 'empty' - то typescript ругается что я передаю в fn undefined, а он ждёт строку, почему так? подскажите, пожалуйста, всю ночь голову ломал уснуть не мог и сейчас не могу понять(

12 ответов

7 просмотров

Потому что у тебя text либо стринг, либо андефайнед. В первом случае у тебя сразу стоит проверка текста на этот момент, поэтому после ? у текста убирается тип андефайнд и в фн попадает стринг. Во втором случае такого не происходит, тс не может догадаться об этом, для него твой флаг просто имеет тип стринг либо андефайнд, но это никак не связано с text.

Х- Автор вопроса
Рой Волков
Потому что у тебя text либо стринг, либо андефайне...

Можно ещё один тупой вопрос вдогонку плз - если у меня перед ? в тернарнике фолс всегда или андефаенд то почему он ругается в таком случае на текст? ведь функция никогда не вызовется и текст никогда не понадобится

Х
Можно ещё один тупой вопрос вдогонку плз - если у ...

ну, так устроен ts, надо принять и простить

Х- Автор вопроса
Рой Волков
ну, так устроен ts, надо принять и простить

Такое поведение где то задокументировано или это типа очевидно?

Х- Автор вопроса
Рой Волков
лично мне это не очевидно, не в курсе.

А как тогда вы к этому пришли и поняли? Простите)

Х
А как тогда вы к этому пришли и поняли? Простите)

зашёл сейчас в плейграунд и проверил. да, действительно так. ну на практике я ни разу не пихал в условие false, зачем..

кстати вот смотри как можно declare function fn(s: string): void; declare const text: string | undefined; function textExists(s?: string): s is string { return !!text; } textExists(text) ? fn(text) : 'empty';

Х- Автор вопроса
Рой Волков
Потому что у тебя text либо стринг, либо андефайне...

Проверить пока нет возможности, но получается если я сделаю функцию isTextExist(text?: string) => text?.trim() то так можно будет сделать const result = isTextExist(text) ? fn(text) : 'hello' ?

Х- Автор вопроса
Х
это где надо записать?

посмотри выше мой пример внимательнее

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
1
Святости? Когда дотумкаешь что открытое лучше закрытого - кастани
zamtmn
9
я имею в виду официально интегрированный в телегу? в том плане что не сливает переписку с пользователем?
Andrey
9
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
19
Кто-нибудь решал проблему с автоматическим скроллингом к выбранной ячейке в TDBGrid в Lazarus? Проблема в том, что есть допустим 3 столбца, третий столбец виден наполовину, вк...
Дмитрий Логинов
1
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
ты вот так хотел? а пурджить arg бесполезно это не макрос, вот рестроить arg смысл есть, но в конце области видимости, а не перед началом новой области видимости.
ProMiNick
7
Карта сайта