diff --git a/native/chat/message-results-screen.react.js b/native/chat/message-results-screen.react.js
--- a/native/chat/message-results-screen.react.js
+++ b/native/chat/message-results-screen.react.js
@@ -6,7 +6,10 @@
 import { ScrollView } from 'react-native-gesture-handler';
 
 import { useFetchPinnedMessages } from 'lib/actions/message-actions.js';
-import { messageListData } from 'lib/selectors/chat-selectors.js';
+import {
+  messageListData,
+  type ChatMessageInfoItem,
+} from 'lib/selectors/chat-selectors.js';
 import {
   createMessageInfo,
   isInvalidPinSourceForThread,
@@ -92,7 +95,10 @@
       // By the nature of using messageListData and passing in
       // the desired translatedMessageResults as additional
       // messages, we will have duplicate ChatMessageInfoItems.
-      const uniqueChatMessageInfoItemsMap = new Map();
+      const uniqueChatMessageInfoItemsMap = new Map<
+        string,
+        ChatMessageInfoItem,
+      >();
       chatMessageInfoItems.forEach(
         item =>
           item.messageInfo &&
@@ -105,9 +111,9 @@
       // in the order of pin_time (newest first).
       const sortedChatMessageInfoItems = [];
       for (let i = 0; i < rawMessageResults.length; i++) {
-        sortedChatMessageInfoItems.push(
-          uniqueChatMessageInfoItemsMap.get(rawMessageResults[i].id),
-        );
+        const { id } = rawMessageResults[i];
+        invariant(id, 'pinned message returned from server should have ID');
+        sortedChatMessageInfoItems.push(uniqueChatMessageInfoItemsMap.get(id));
       }
 
       return sortedChatMessageInfoItems.filter(Boolean);