diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 2969a9e5..78b93cd9 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -270,12 +270,8 @@ impl Application {
         }
         let editor_view = self
             .compositor
-            .find(std::any::type_name::<ui::EditorView>())
+            .find::<ui::EditorView>()
             .expect("expected at least one EditorView");
-        let editor_view = editor_view
-            .as_any_mut()
-            .downcast_mut::<ui::EditorView>()
-            .unwrap();
 
         if editor_view.completion.is_some() {
             return;
@@ -440,12 +436,8 @@ impl Application {
                     {
                         let editor_view = self
                             .compositor
-                            .find(std::any::type_name::<ui::EditorView>())
+                            .find::<ui::EditorView>()
                             .expect("expected at least one EditorView");
-                        let editor_view = editor_view
-                            .as_any_mut()
-                            .downcast_mut::<ui::EditorView>()
-                            .unwrap();
                         let lsp::ProgressParams { token, value } = params;
 
                         let lsp::ProgressParamsValue::WorkDone(work) = value;
@@ -559,12 +551,8 @@ impl Application {
 
                         let editor_view = self
                             .compositor
-                            .find(std::any::type_name::<ui::EditorView>())
+                            .find::<ui::EditorView>()
                             .expect("expected at least one EditorView");
-                        let editor_view = editor_view
-                            .as_any_mut()
-                            .downcast_mut::<ui::EditorView>()
-                            .unwrap();
                         let spinner = editor_view.spinners_mut().get_or_create(server_id);
                         if spinner.is_stopped() {
                             spinner.start();
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index e9bfdfdd..847e6f09 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -4735,19 +4735,15 @@ pub fn completion(cx: &mut Context) {
                 return;
             }
             let size = compositor.size();
-            let ui = compositor
-                .find(std::any::type_name::<ui::EditorView>())
-                .unwrap();
-            if let Some(ui) = ui.as_any_mut().downcast_mut::<ui::EditorView>() {
-                ui.set_completion(
-                    editor,
-                    items,
-                    offset_encoding,
-                    start_offset,
-                    trigger_offset,
-                    size,
-                );
-            };
+            let ui = compositor.find::<ui::EditorView>().unwrap();
+            ui.set_completion(
+                editor,
+                items,
+                offset_encoding,
+                start_offset,
+                trigger_offset,
+                size,
+            );
         },
     );
 }
diff --git a/helix-term/src/compositor.rs b/helix-term/src/compositor.rs
index dc8b91d7..3a644750 100644
--- a/helix-term/src/compositor.rs
+++ b/helix-term/src/compositor.rs
@@ -177,11 +177,12 @@ impl Compositor {
             .any(|component| component.type_name() == type_name)
     }
 
-    pub fn find(&mut self, type_name: &str) -> Option<&mut dyn Component> {
+    pub fn find<T: 'static>(&mut self) -> Option<&mut T> {
+        let type_name = std::any::type_name::<T>();
         self.layers
             .iter_mut()
             .find(|component| component.type_name() == type_name)
-            .map(|component| component.as_mut())
+            .and_then(|component| component.as_any_mut().downcast_mut())
     }
 }