diff --git a/app/assets/javascripts/discourse/app/models/topic.js b/app/assets/javascripts/discourse/app/models/topic.js
index 6de4b88f73e..95b147922a0 100644
--- a/app/assets/javascripts/discourse/app/models/topic.js
+++ b/app/assets/javascripts/discourse/app/models/topic.js
@@ -1,4 +1,4 @@
-import { and, equal, not, notEmpty, or } from "@ember/object/computed";
+import { and, equal, notEmpty, or } from "@ember/object/computed";
 import { fmt, propertyEqual } from "discourse/lib/computed";
 import ActionSummary from "discourse/models/action-summary";
 import Category from "discourse/models/category";
@@ -210,7 +210,11 @@ const Topic = RestModel.extend({
     });
   },
 
-  invisible: not("visible"),
+  @discourseComputed("visible")
+  invisible(visible) {
+    return visible !== undefined ? !visible : undefined;
+  },
+
   deleted: notEmpty("deleted_at"),
 
   @discourseComputed("id")
diff --git a/app/assets/javascripts/discourse/tests/unit/models/topic-test.js b/app/assets/javascripts/discourse/tests/unit/models/topic-test.js
index cbad413691c..c451f5e1070 100644
--- a/app/assets/javascripts/discourse/tests/unit/models/topic-test.js
+++ b/app/assets/javascripts/discourse/tests/unit/models/topic-test.js
@@ -163,4 +163,18 @@ discourseModule("Unit | Model | topic", function () {
       "supports emojis"
     );
   });
+
+  test("visible & invisible", function (assert) {
+    const topic = Topic.create();
+    assert.equal(topic.visible, undefined);
+    assert.equal(topic.invisible, undefined);
+
+    const visibleTopic = Topic.create({ visible: true });
+    assert.equal(visibleTopic.visible, true);
+    assert.equal(visibleTopic.invisible, false);
+
+    const invisibleTopic = Topic.create({ visible: false });
+    assert.equal(invisibleTopic.visible, false);
+    assert.equal(invisibleTopic.invisible, true);
+  });
 });