Массив машинописного текста не может быть назначен после карты и поиска

Следующий код

const s: string[] = ["x", "y", "z"].map(i => ["x"].find(t => t === i));

Это вызывает ошибку «Тип '(string | undefined)[]' нельзя присвоить типу 'string[]'.», поскольку find дает string | undefined. Поэтому я надеялся, что добавление фильтра может исправить это, например:

const s: string[] = ["x", "y", "z"].map(i => ["x"].find(t => t === i)).filter(i => i);

Но это не сработало, почему?

ТС версии 4.2.3

TypeScript не выведет предикат типа, поможет .filter((i): i is string =>.

jonrsharpe 05.05.2022 17:35

Или, может быть, stackoverflow.com/q/63541843/3001761

jonrsharpe 05.05.2022 17:37
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
2
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы точно знаете, что вызов find здесь вернет никогдаundefined, вы можете использовать утверждение с '!':

const s: string[] = ["x", "y", "z"].map(i => ["x"].find(t => t === i)!);
//                                                                   ^

В противном случае вам придется написать охрану:

function isDefinitelyAString(val: unknown): val is string {
    return typeof val === "string";
}

const s: string[] = ["x", "y", "z"].map(i => ["x"].find(t => t === i)).filter(isDefinitelyAString);

Вы также можете встроить охрану, как предлагает @jonrsharpe:

const s: string[] = ["x", "y", "z"].map(i => ["x"].find(t => t === i)).filter((i): i is string => typeof i === "string");

Обратите внимание, что .filter((i): i is string => i) сам по себе не подходит, потому что только логические значения совместимы с предикатами типа.

jonrsharpe 05.05.2022 17:38

Я просто хочу добавить, что оператор ! всегда опасен, поэтому, если есть какое-то решение, чтобы избежать его, вы должны это сделать. Гвардия будет лучше на 100%

programmer 05.05.2022 17:38

Вот почему я сказал, что если вы знаете наверняка, то вы можете использовать это, но все же это рискованно.

catgirlkelly 05.05.2022 17:39

@jonrsharpe Да, хороший улов, я обновил его, спасибо.

catgirlkelly 05.05.2022 17:39

Спасибо, это быстро! Почему я не могу просто добавить! до конца filter?

user1589188 05.05.2022 17:53

'!' утверждает, что предыдущее выражение не может быть неопределенным или нулевым. После фильтра тип (string | undefined)[] и поэтому работать не будет.

catgirlkelly 05.05.2022 17:57

Я заменил typeof i === "string" на !!i

user1589188 06.05.2022 03:44

Другие вопросы по теме