diff --git a/tools/kv_typed/src/as_bytes.rs b/tools/kv_typed/src/as_bytes.rs
index 4e8cebea2a66c091964ad8024e3fec0c5fc52191..20045fdf081a7eccc868e8639e18840b406e7c97 100644
--- a/tools/kv_typed/src/as_bytes.rs
+++ b/tools/kv_typed/src/as_bytes.rs
@@ -26,20 +26,16 @@ where
     }
 }
 
-macro_rules! impl_as_bytes_for_smallvec {
-    ($($N:literal),*) => {$(
-        impl<T> AsBytes for SmallVec<[T; $N]>
-        where
-            T: zerocopy::AsBytes,
-        {
-            fn as_bytes<D, F: FnMut(&[u8]) -> D>(&self, mut f: F) -> D {
-                use zerocopy::AsBytes as _;
-                f((&self[..]).as_bytes())
-            }
-        }
-    )*};
+impl<T, const N: usize> AsBytes for SmallVec<[T; N]>
+where
+    T: zerocopy::AsBytes,
+    [T; N]: smallvec::Array<Item = T>,
+{
+    fn as_bytes<D, F: FnMut(&[u8]) -> D>(&self, mut f: F) -> D {
+        use zerocopy::AsBytes as _;
+        f((&self[..]).as_bytes())
+    }
 }
-impl_as_bytes_for_smallvec!(1, 2, 4, 8, 16, 32, 64);
 
 impl<T> AsBytes for BTreeSet<T>
 where